Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:obj.fn()vs x=obj.fn;x()_Javascript - Fatal编程技术网

Javascript:obj.fn()vs x=obj.fn;x()

Javascript:obj.fn()vs x=obj.fn;x(),javascript,Javascript,请看以下片段: var obj = { fn: function () {return this;} }; var x = obj.fn; obj.fn(); // returns obj x(); // returns window (in the browser) 我很好奇为什么obj.fn()不同于x=obj.fn;x()。在单个表达式中,属性查找后直接进行函数调用是否有特殊情况?或者在后台有更复杂的魔力(如Python中的情况)?来自此上下文变量的值始终取决于函数

请看以下片段:

var obj = {
    fn: function () {return this;}
};
var x = obj.fn;    

obj.fn();  // returns obj
x();  // returns window (in the browser)

我很好奇为什么
obj.fn()
不同于
x=obj.fn;x()
。在单个表达式中,属性查找后直接进行函数调用是否有特殊情况?或者在后台有更复杂的魔力(如Python中的情况)?

来自
上下文变量的值始终取决于函数的调用方式

obj.fn();
将调用函数作为
方法
,这意味着其
值将始终引用包含的对象,在本例中为
obj

通过将引用直接存储在
x
中,该函数在全局范围内称为“就像那样”,这意味着在非ES5严格模式环境下,它将始终引用
全局对象
,在ES5严格模式下,它将是
未定义的

因此,在变量中引用对象方法时,始终需要小心。如果这样的方法希望通过
this.someProp
从自己的对象访问某些数据,那么如果
this
绑定到另一个对象/上下文,则显然会失败



免责声明:“将始终引用包含对象”并不完全正确。如果函数通过
function.prototype.bind()
绑定到另一个对象,它将始终引用该绑定对象。

@Tim Down:谢谢,我自己还没有找到。不幸的是,该规范的可读性有一个缺陷。。埃克姆。。质量有问题:)无论如何,很遗憾,属性查找和调用运算符的组合给出的结果与单独使用它们不同。