Javascript 这是.globalvar vs.window.globalvar
我最近在某个地方读到(很抱歉,我无法提供源代码),您可以使用Javascript 这是.globalvar vs.window.globalvar,javascript,cross-browser,Javascript,Cross Browser,我最近在某个地方读到(很抱歉,我无法提供源代码),您可以使用this.varname访问全局文件,以替换窗口。varname保存2个字符 var myVar = "global"; function myFunc() { var myVar = "notGlobal"; alert( this.myVar ); //global } 这似乎有效,但我想知道: 在旧浏览器中使用是安全的 它是跨浏览器兼容的 在某些奇怪的情况下它会失败 我不认为我会这么做,但如果它是指全局对象(窗
this.varname
访问全局文件,以替换窗口。varname
保存2个字符
var myVar = "global";
function myFunc() {
var myVar = "notGlobal";
alert( this.myVar ); //global
}
这似乎有效,但我想知道:
- 在旧浏览器中使用是安全的
- 它是跨浏览器兼容的
- 在某些奇怪的情况下它会失败
窗口
),它是完全跨浏览器兼容的。是否是将取决于所讨论的函数是如何调用的(在全局范围内,这个
确实引用了全局对象),以及所讨论的代码是否处于“严格模式”。(在中,此
不引用全局对象。)
在非严格代码中:
因此,在全球范围内:
console.log(this === window); // true if not in strict mode
同样,如果您有一个直接调用的函数:
function foo() {
console.log(this === window);
}
foo(); // Logs "true"
但是在JavaScript中,这个
完全由函数的调用方式设置。所以我们可以调用foo
settingthis
来调用其他内容:
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
设置为任何其他内容的情况下调用它(通过调用
或应用
,或从上面的对象属性a'laobj.f
使用它),然后,它将再次可靠地引用全局对象。这在章节(输入全局代码)和(输入函数代码)中介绍我相信从一开始就是这样的;在过去的15年里肯定是这样,所以你不太可能找到一个不符合规范的环境
更多阅读:
window
),那么它是完全跨浏览器兼容的。是否是取决于所讨论的函数是如何调用的(在全局范围内,这确实是指全局对象),以及所讨论的代码是否处于“严格模式”(在中,此
不指全局对象)
在非严格代码中:
因此,在全球范围内:
console.log(this === window); // true if not in strict mode
同样,如果您有一个直接调用的函数:
function foo() {
console.log(this === window);
}
foo(); // Logs "true"
但是,在JavaScript中,这个
完全由函数的调用方式来设置。因此我们可以调用foo
设置这个
来调用其他内容:
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
设置为任何其他内容的情况下调用它(通过调用
或应用
,或从上面的对象属性a'laobj.f
使用它),然后,它将再次可靠地引用全局对象。这在章节(输入全局代码)和(输入函数代码)中介绍我相信从一开始就是这样的;在过去的15年里肯定是这样,所以你不太可能找到一个不符合规范的环境
更多阅读:
此
始终有一个值。如果此
未以某种方式被覆盖,则它将是窗口
中所有全局变量的位置
它可以在所有JS实现中工作,但要小心!这更脆弱,而且它并不总是指向全局变量
例如:
var myVar = "global";
var obj = {
myVar: "property",
fn: function() { return this.myVar; }
}
console.log(obj.fn()); // "property"
这会失败,因为在此上下文中,这个
就是那个对象。但是当执行一个不是对象属性的函数时,这个
将默认为窗口,就像您的示例一样。这个
总是有一个值。如果这个
没有被重写,那么它将是窗口
,所有的我们的环球是
它可以在所有JS实现中工作,但要小心!这更脆弱,而且它并不总是指向全局变量
例如:
var myVar = "global";
var obj = {
myVar: "property",
fn: function() { return this.myVar; }
}
console.log(obj.fn()); // "property"
这会失败,因为在此上下文中,此
就是该对象。但当执行非对象属性的函数时,此
将默认为窗口,如您的示例所示。如果有人拍击“use strict”在现代浏览器中不起作用上述代码为,此
将在函数中未定义
<script type="text/javascript">
"use strict";
...
function test(){
console.log(this);
}
test(); // undefined
</script>
将最小化为(无空格):
其中作为此
不会被触摸,因为它是一个关键字。如果有人在您的代码上方加上“use strict”,则它在现代浏览器中不起作用,因为此
将在函数内部未定义
<script type="text/javascript">
"use strict";
...
function test(){
console.log(this);
}
test(); // undefined
</script>
将最小化为(无空格):
其中,此
不会被触摸,因为它是一个关键字。您只能在全局范围(窗口
的范围)中运行代码时执行此操作。不要执行此操作以“保存2个字符”@JamesMcLaughlin:不,默认情况下,函数调用的this
也引用全局对象。只要this
引用窗口
对象,就应该是安全的。但是,在其他地方,我认为没有任何保证。您只能在全局范围内运行代码时才能这样做(窗口的范围
)。不要为了“保存2个字符”而这样做@JamesMcLaughlin:不,默认情况下,函数调用的this
也指全局对象。如果this
指的是窗口
对象,应该在任何地方都是安全的。但是,在其他地方,我认为没有任何保证。@alexwayne的这个和ans吓得我不敢使用这个和@alexwayne的ans scare我受够了,再也不用了