return this || (0,eval)('this');
return this || (0,eval)('this');
查看doT.js源代码:
https://raw.github.com/olado/doT/master/doT.js这是做什么的?
(function(){ return this || (0,eval)('this'); }()).doT = doT;
对我来说,它看起来像是在创建一个全局变量,window.doT
。如果这就是它的全部功能,那么为什么不呢:
window.doT = doT;
?
它正在获取对全局对象的引用,以便将doT
分配给它。这通常是这样做的,因为对于JavaScript库/框架等,它的一个全局标识符需要暴露给外部世界。
至于为什么它不是简单的window.doT = doT;
,这是因为全局对象并不总是window
,例如,在非浏览器环境中。也可以在执行此代码时将window
赋值给其他地方。
工作原理
如果this
已经为真,例如,一个对象如window
,它将返回该值。它很可能是window
(至少在浏览器中),因为普通函数调用应该将其ThisBinding
设置为全局对象。否则,它将在全局作用域中执行eval()
,因为对eval()
的间接调用将其作用域设置为全局,而不是调用环境的作用域。
实现一个间接调用,你必须间接调用eval()
,也就是说,你不能只调用eval()
。您可以使用(0, eval)
来调用它。这依赖于逗号操作符返回最后求值的表达式,在本例中为eval
。前面的操作数是什么并不重要。同样,(0||eval)()
也可以。
至于为什么主体是this
,那是eval()
的参数,那是作为字符串执行的代码。它将返回全局范围内的this
,它始终是全局对象。
这在现在并不重要,但是在旧的ie中,你需要使用execScript()
来执行全局作用域中的代码。
只在被接受的答案中添加一点,作为精简注释视图中的最后一个问题" (eval)('this')
不会工作吗?"它的答案在评论中丢失了。简单的测试:
> foo = 123
< 123
> (function() { const foo = 234; console.log(
foo, // baseline
eval('foo'), // direct eval using local scope
(eval)('foo'), // (eval) still direct
(1, eval)('foo'), // indirect by comma-operator
(false||eval)('foo')); // indirect by or-operator
})()
< 234 234 234 123 123
显示
-
(eval)
与(0, eval)
(或者,这里是(1,eval)
)不一样,因为逗号操作符是间接的,而括号不是间接的,只是一个语法分组,单纯的括号不通过操作传递它的参数,所以它仍然是直接的。 -
(false||eval)
方法依赖于 false 之前的参数,因此逗号操作符更好,它对第一个值的影响较小。
对我来说,逗号操作符是这里最大的啊哈,这就是为什么我在这里停留了一会儿。
我也有一个担心,即,这个技巧可能会被意外地从可能作为方法添加到原型的函数中使用。在这种情况下,第一个this
不再是全局对象。这就是为什么,为了真正安全,在我看来,应该只坚持使用(0,eval)('this')
表达式。
- $(this).prop('property') vs. this.property
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- 在另一个函数中使用变量this
- this.router在AngularJS 2中未定义
- reactjs this.refs vs document.getElementById
- JavaScript 中的嵌套函数和 “this” 关键字
- React+Meteor:this.ops返回未定义
- javascript中对象构造函数中的var属性与this.properties
- 使用return相对于this的优势
- 如何将 ** return (this.innerText.length <= 200) ** 移动到函数
- 下划线模板错误:函数(n){return a.call(this,n,h)}
- Javascript "return this" meet the "return&quo
- 我的onsubmit=“;return onNewUserRegistrationCheck(this)"仍然
- 为什么构造函数(带“return this”)返回窗口对象?
- return this"在javascript函数中执行
- Javascript函数"return this"不工作
- return this'在函数.间接使用时的原型定义
- return this || (0,eval)('this');
- JSF:: h:commandLink onsubmit(return validateRow(this)) probl
- 索引或大小为负值或大于允许值.code: "1 [Break On This Error] return se