Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这是.globalvar vs.window.globalvar_Javascript_Cross Browser - Fatal编程技术网

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
setting
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
设置为任何其他内容的情况下调用它(通过
调用
应用
,或从上面的对象属性a'la
obj.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'la
obj.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我受够了,再也不用了