this.globalvar vs window.globalvar

this.globalvar vs window.globalvar

本文关键字:globalvar window vs this      更新时间:2023-09-26

我最近在某处读到(真的很抱歉我无法提供源代码(,您可以使用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任何其他内容(通过 callapply,或从上面的对象属性 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,就像您的示例一样。