this.globalvar vs window.globalvar
this.globalvar vs window.globalvar
我最近在某处读到(真的很抱歉我无法提供源代码(,您可以使用this.varname
访问全局变量以代替window.varname
以节省 2 个字符
var myVar = "global";
function myFunc() {
var myVar = "notGlobal";
alert( this.myVar ); //global
}
它似乎有效,但我想知道是否:
- 在旧浏览器中使用是安全的
- 它是跨浏览器兼容的
- 它会在一些奇怪的情况下失败
我不认为我会这样做,但如果this
指的是全局对象(window
(,它是完全跨浏览器兼容的。是否是将取决于所讨论的函数是如何调用的(在全局范围内,this
确实引用全局对象(,以及所讨论的代码是否处于"严格模式"。 (在严格模式下,this
不引用全局对象。赞扬和赞成Esailija指出这一点。
在非严格代码中:
因此,在全球范围内:
console.log(this === window); // true if not in strict mode
同样,如果你有一个直接调用的函数:
function foo() {
console.log(this === window);
}
foo(); // Logs "true"
但是,在 JavaScript 中,this
完全由函数的调用方式设置。因此,我们可以将foo
设置this
称为其他内容:
var obj = {};
foo.call(obj); // Now it logs "false", `this` === `obj` during the call
同样地:
var obj = {};
obj.f = foo;
obj.f(); // Also logs "false", `this` === `obj` during the call
所以总之,在全局范围内(不是在任何函数调用中(,是的,this
可靠地指向全局对象,如果您控制函数的调用方式并且调用它而不设置this
任何其他内容(通过 call
或 apply
,或从上面的对象属性 a'la obj.f
使用它(, 然后,它将再次可靠地引用全局对象。规范的第 10.4.1 节(输入全局代码(和第 10.4.3 节(输入函数代码(对此进行了介绍。我相信,从一开始就是这样;当然是在过去的 15 年里,所以你不太可能找到一个不合规的环境。
更多阅读:
- 神话般的方法
- 你必须记住
this
人在代码上方打上"use strict",它将在现代浏览器中不起作用,因为this
将在函数中undefined
。
<script type="text/javascript">
"use strict";
...
function test(){
console.log(this);
}
test(); // undefined
</script>
请注意,只需将window
分配给代码顶部的某个变量并使用它,就可以保存更多字符,因为它将被最小化器缩短为某个字符变量。
(function(global){
global.foo();
global.bar();
})(window);
将最小化为(不带空格(:
(function(a){
a.foo();
a.bar();
})(window);
this
不会被触及,因为它是一个关键字。
this
总是有一个值。 如果this
没有以某种方式被覆盖,那么它将window
所有全局变量的位置。
它将在所有JS实现中工作,但要小心!这更脆弱,它不会总是指向全局变量。
例如:
var myVar = "global";
var obj = {
myVar: "property",
fn: function() { return this.myVar; }
}
console.log(obj.fn()); // "property"
此操作失败,因为在此上下文中this
是该对象。 但是当执行不是对象属性的函数时,this
将默认为 window,就像您的示例一样。
- 正在寻找比$(document).ready慢的$(window).load的替代方案
- 直接下载文件,而不是从window.open(url)
- $window.ga在AngularJS事件中未定义
- 如何将PDF作为二进制文件传递到window.open()
- window.onload没有'无法在Android WebView中工作
- window.location替换并传递URL历史记录条目中的变量
- window.on.scroll事件未启动
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- 为什么window.open不打开一个以变量形式给出的链接
- window.location使用jquery mobile实现chrome跳转
- window.opener.document在ie中不起作用
- window.onpopstate不工作;当我导航回页面时,不会发生任何事情
- 未捕获的类型错误:topFrame.window.changeSelectedBarStyle不是函数,原因是什么
- 通过window.opener将弹出窗口中的值传递给父窗口
- $(document).height和$(window).heaght都返回相同的值-使用的是正确的doctype
- 如何在`window.open`之后执行回调
- Windows.Open 在 window.Location 工作时不起作用
- javascript window.open将无法在Chrome控制台上工作
- $(window).height() inside iframe?
- this.globalvar vs window.globalvar