javascript函数作用域

javascript函数作用域,javascript,Javascript,谁能解释为什么这个代码中的结果是[20,20,10,10]: var x = 10; var foo = { x: 20, bar: function () { var x = 30; return this.x; } }; console.log( foo.bar(), (foo.bar)(), (foo.bar = foo.bar)(), (foo.bar, foo.bar)() ); 欢迎链接到规范我认为以下内容将对此有所帮助。前两个函数调用

谁能解释为什么这个代码中的结果是[20,20,10,10]:

var x = 10;
var foo = {
  x: 20,
  bar: function () {
    var x = 30;
    return this.x;
  }
};

console.log(
  foo.bar(),
  (foo.bar)(),
  (foo.bar = foo.bar)(),
  (foo.bar, foo.bar)()
);

欢迎链接到规范

我认为以下内容将对此有所帮助。

前两个函数调用是等效的。他们在
foo
的上下文中调用
foo
bar
方法,因此
this.x
返回的值是
foo
x
属性的值,即
20


后两个调用的语法都有问题/无效。试着运行你的代码,你会发现它会吐出几个错误,然后完全阻塞。关于它们返回
10
的原因,我的最佳猜测是,它试图在不应该解析代码的情况下解析您的代码,并且正在变得混乱<可能会返回code>10,因为浏览器无法识别您正在尝试执行的操作,并且默认为全局(窗口)范围,
x
的值为
10
。这也解释了Ramesh Vel的评论,即后两个值在IE中显示为未定义。由于语法无效,不同的JavaScript实现可能会以不同的方式处理它们。

无法指出规范,但我强烈建议阅读。这本书将帮助您理解JavaScript的大部分奇怪但伟大的特性

关于你的问题:

  • foo.bar(),
    函数中的
    关键字绑定到
    foo
    对象
  • (foo.bar)()与上文相同
  • 在javascript中,可以从右向左多次分配变量

    z=3; x=(y=z); 控制台日志(x)//三,

  • 函数和其他任何东西一样都是变量。因此,您将函数
    foo.bar
    分配给
    foo.bar
    ,但括号会导致返回分配的函数,然后执行

    (foo.bar = foo.bar)(); 
    //is the same as
    var f = (foo.bar = foo.bar);
    f(); 
    //and this also the same as:
    var f= foo.bar;
    f();
    
    从括号中返回的函数没有绑定到任何对象,因此
    将引用全局对象(对于浏览器)-指向
    窗口
    对象

    四,。。该条款(foo.bar,foo.bar)与以下条款完全相同:

    a = (3, 4); //last value is returned, first just parsed.
    //a contains 4
    
    var f = (foo.bar, foo.bar); 
    //f contains body of foo.bar function, 
    f() // is executed  in the context of `global` object, eg. `window`. 
    

    请阅读JavaScript中函数的绑定。

    在IE中,输出似乎是20,20,未定义,未定义。。