this指向问题

背景

看到一段话是用apply将foo的参数传给bar的方法

 // 使用 apply 将 foo 的参数传递给 bar
        function foo() {
            bar.apply(this,arguments);
        }

        function bar() {  
            console.log(arguments);
        }
        foo(1)

执行foo可以打印出伪数组{0: 1}

问题

当我将形参arguments改为一个具体的参数时,如下面

 // 使用 apply 将 foo 的参数传递给 bar
        function foo(a) {
            bar.apply(this,a);
        }

        function bar() {  
            console.log(a);
        }
        foo(1)

执行上段代码会提示CreateListFromArrayLike called on non-object错误请问为什么呢

阅读 2.5k
4 个回答

两个原因。

  1. apply的第二个参数是个数组(或伪数组),apply(this,a)a不是,所以有你的那个报错。
  2. arguments是函数内置的一个变量,你可以当做函数内帮你声明好的,当你把apply改成call后,你会看到另一个报错:a is not defined,因为bar内和全局都没有a这个变量。

形参是一个 arguments 类数组对象 你给他传一个变量形参 输出的时候它应该不是对象没法存 参数1

第二段,声明的时候bar是不带参数的函数,你就算传了1个但定义的bar是不带参数的函数,也不会识别的。

function foo(a) {
        bar.apply(this,[a]);
    }

    function bar(a) {  
        console.log(a);
    }
    foo(1);
    
    
    去看看apply的使用方法,基础语法没掌握,apply的第二个参数是类似数组的数据类型。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题