到底使用call还是apply?课程举得例子实际敲出来不对啊!

到底使用call还是apply?课程举得例子实际敲出来不对啊!

问题描述:

这节课老师为了说明fun2.apply(thisarguments);要使用apply而不是call时举了下面这个例子,是代码片段。因为这里a,b在代码中没有定义,自然得不到77这个老师讲的结果。

相关代码:

        function fun1() {
            fun2.apply(this, arguments)
            console.log(this, arguments);
        }
        function fun2() {
            alert(a + b);
        }
        fun1(33, 44);

尝试过的解决方式:

我尝试定义了全局变量a,b和在fun2中定义了局部变量a,b。运行结果是弹出NaN

相关代码:

        // var a,b;
function fun1() {
fun2.apply(this, arguments);
console.log(this, arguments);
}
function fun2() {
var a, b;
alert(a + b);
console.log(a,b);
}
fun1(33, 44);

相关截图:

http://img1.sycdn.imooc.com//climg/60ed3fc10953ea5105770176.jpg

http://img1.sycdn.imooc.com//climg/60ed411c09d809b116240069.jpg

请问该怎么办?


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,建议参考以下思路来理解这段代码:

首先,对于fun1函数,它是一个带参函数,调用时传入了两个参数:fun1(33, 44),而且在fun1函数中是使用arguments类数组对象来接收的这两个参数。

其次,fun2函数执行了以下代码:指定fun2函数的上下文,并传入了fun1函数的arguments作为参数:

fun2.apply(this, arguments)   // arguments为类数组对象,所以使用apply

注:传参时,call用逗号罗列参数,apply要以数组的形式传递参数。

因此,fun2函数也是一个带参函数,定义时要传入形参a和b,函数中才可以使用这两个形参,否则报错,代码如下

function fun2(a,b) {
   console.log(a + b);
}

同学的解决方案中,只是定义了变量a和b,并未赋值,所以运行结果为NaN。

祝学习愉快!

  • 行健同学 提问者 #1

    老师说的对,这里我没有理解透。对于 fun2.apply(this, arguments); 要想让arguments在函数fun2中起作用,fun2必须有能接受它们的形参变量。我只是沿着this在这里是window对象,就想着arguments要和window对象的变量联系。其实不是, arguments是和fun2联系的,this也是和fun2联系的,arguments和this之间反而没有什么联系。

    所以,如果把fun2的定义改一下

    function fun2(a, b) {

        alert(this.x+this.y+a+b);

    }

    再定义全局变量x, y并赋值。fun1(33, 44)在运行时才能把window.x , window.y和arguments,[33, 44]都联系起来参加运算。

    同理,如果这里定义fun1时采用如下方式:

    function fun1(m, n) {

           fun2.call(this, m, n); 

    }

    这里就必须在fun1中加入形参m , n  同时在制定上下文是不能使用apply而必须使用call了。

            function fun1(mn) {

                fun2.call(thismn);

            }

            function fun2(a,b) {

                alert(a + b);

            }

            fun1(3344);

    http://img1.sycdn.imooc.com//climg/60ee979209ec2f4905610165.jpg

    2021-07-14 15:51:51
  • 好帮手慕然然 回复 提问者 行健同学 #2

    同学你好,理解的没问题,继续加油,祝学习愉快!

    2021-07-14 16:07:20
  • 行健同学 提问者 回复 好帮手慕然然 #3

    谢谢!fighting

    2021-07-14 16:48:01
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师