清除我对这种 js 模式的想法
Clear my mind on this js pattern
我经常看到这种模式
(function(){}).call(this)
这个也一样吗?
(function(that){})(this)
提前致谢
编辑
这两个代码是否试图解决同一个问题?这是背景?
编辑
任何人都可以编辑标题并提供更好的标题,因为我认为这很有趣。
不,不是,另一个为函数提供对象上下文,另一个传递没有任何对象上下文的参数。
想象一个泛型函数,如Array#shift()
:
var shift = Array.prototype.shift;
//Shift expects an object context, and cannot be called without one.
//so this won't work:
shift($("div"))
//undefined
//This does:
shift.call($("div"))
//<div id="notify-container"></div>
在问题之后编辑:
不。Function.prototype.call 接受 this
作为其第一个参数。 在这种情况下,this
不会作为实际参数传递到函数中。但是,您可以在第二个函数中that
将实际传递的this
进行寻址。
编辑:这是一个示例。
MyObject = {};
MyObject.prototype.myMethod = function(value) { console.log("Hello, " + value); }
var obj = new MyObject();
function myMethodCaller(value)
{
this.myMethod(value);
}
myMethodCaller("World!");
myMethodCaller.call(obj, "World!");
- 第一次调用将失败并出现错误,因为 [隐式]
this
(接收方)通常是window
(更一般地说,全局对象,无论它在上下文中是什么)。例如,对于工人来说,这是不同的),它没有myMethod
方法。 - 第二次调用会将"Hello, World!"记录到您的控制台中,因为
this
将指向obj
,myMethod
方法将在其上调用。
这两个代码是否试图解决同一个问题? 的上下文 这?
是的,但方式不同。
第一个版本调用Function.prototype.call
作为第一个参数,接受被调用函数上下文中的this
变量将引用的上下文对象。
第二个版本只是自调用匿名函数,并将引用this
的对象(在调用上下文中)传递给匿名函数。现在,在调用的匿名函数上下文中,我们可以通过 that
访问它。 this
将global
或undefined
(取决于 ES5 严格模式)
相关文章:
- D3.js模式不适用于弧形或圆环图
- 带有let的JS/EECMAScript6私有字段的模式
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- 从联合js rect对象调用引导模式
- 无法加载Ace.js编辑器模式和主题(命名空间项目&AMD require.js&grunt
- 查看完某个页面后,在重定向的页面上弹出js模式
- node.js可以识别字符模式,但不能识别数字模式
- 含义模式:'中止'在JS Ajax请求中
- 如果我使用或不使用“;使用严格的“;JS中的模式
- 使用模式在 HTML5/JS 中绘制图像
- 如何在 ember.js 中的模式对话框中打开路由
- 清除我对这种 js 模式的想法
- 在 Node 中.js释放 zalgo 的设计模式为什么异步路径是一致的
- 被动.js模式间接观察者报告相同的值
- Ember.js网点的模式改变了,但内容没有改变
- Node.JS中的模式顺序是否重要
- Bootstrap JS模式加载,但不可编辑
- Node.js+Mongoose:与数据库逻辑分离的模型/模式
- Bootstrap3模式js未定义函数