js作用域的问题?

var len = 5;
var fn1 = function  () {
    console.log(this.len);
};
var main = {
    method: function (fn) {
        fn();
        arguments[0]();
    },
    len : 10
};
main.method(fn1);
阅读 2.8k
6 个回答

这哪是作用域问题呀,这是this指向的问题。

因为 fn 的调用是fn() 所以里面的thiswindow,所以输出是winodw.len5

var fn1 = function  () {
    console.log(this.len);
};

直接执行fn1的结果是5 很显然这个函数里面的this指向的是window

关于 this 的指向问题,前 fn() 是直接运行的函数,内部 this 应该指向 window。

让我疑惑的是

arguments[0](); // 'underfined'

后来想明白了,arguments 是一个对象,且 arguments[0] = fn,故执行的时候,this 指向 arguments ,但 arguments 的 len 为 underfined

fn() 弹出5, 没有调用者,属于直接执行

arguments[0]() 弹出 undefined,调用者为 arguments,弹出 arguments.len = undefined

如果需要10,那么应该这么写:

var len = 5;
var fn1 = function  () {
    console.log(this.len);
};
var main = {
    method: function (fn) {
        fn.call(this,arguments);
    },
    len : 10
};
main.method(fn1);

很多框架或者插件都应该能看到这种写法。

那么写和直接执行没啥区别。

var len = 5;
var fn1 = function  () {
    console.log(this.len);
};
var main = {
    method: function () {
        fn1()
    },
    len : 10
};
main.method(fn1);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题