Javascript: obj.fn() vs x=obj.fn;x()
Javascript: obj.fn() vs x=obj.fn;x()
看看这个片段:
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中的描述符协议)?
this
上下文变量的值始终取决于函数的调用方式。
obj.fn();
将调用函数作为method
,这意味着它的this
值将始终引用包含的对象,在本例中为obj
。
通过直接在x
中存储引用,函数在全局范围中被称为"就像那样",这意味着它在非ES5严格模式环境中总是引用global object
,在ES5严格方式中它将是undefined
。
因此,在引用变量中的对象方法时总是需要小心。如果这样的方法想通过this.someProp
从它自己的对象访问一些数据,那么如果this
绑定到另一个对象/上下文,它显然会失败。
免责声明:"将始终引用包含的对象"并不完全正确。如果函数通过Function.prototype.bind()
绑定到另一个对象,它将始终引用该绑定对象
相关文章:
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- Three.JS OBJ模型未显示
- angular.js:13424错误:[ng:areq]参数'fn'不是函数,getObject
- ThreeJS访问加载的obj模型中的对象
- 无法在obj+mtl文件中加载纹理
- Babel编译错误:找不到模块核心js/library/fn/get迭代器
- Php variable obj to js
- JS-fn()中返回后方括号的含义{return{}[]}
- JSTree's data.rslt.obj.text()返回一个文本数组,而不是所需节点的文本
- 如何将Three.js场景中的几何体导出为已修改的OBJ
- 用Div内容创建obj
- Three.js.obj阴影不起作用
- 将.obj转换为.js文件
- 通过fn.apply或fn.bind将函数传递给setTimeout
- 我应该只在指令的链接 fn 中进行 DOM 操作吗?
- 如何将 fn 去抖动实现到 jQuery keyup 事件中
- Extending jQuery.fn.method
- TypeError: 使用 Jquery JSON 获取数据时无效的 'in' 操作数 obj
- 这条线是如何工作的:obj['e'+type+fn] = fn
- Javascript: obj.fn() vs x=obj.fn;x()