JavaScript的“this”关键字,并关闭编译器警告(JavaScript “this” ke

2019-08-02 01:43发布

我有生产代码,我现在想用用关闭编译器的高级选项来缩小。 该代码使用保罗的客户端cookie库 。 编译器生成了这些警告的30:

JSC_USED_GLOBAL_THIS: dangerous use of the global this object

以下是保罗的图书馆借了一些代码段(oroginal代码使用命名函数,而不是匿名函数):

  var cookieObject = function (name, expires, accessPath) {
        var i, j
        this.name = name
        this.fieldSeparator = "#"
        // this.found = false
        this['found'] = false;  // don't allow Closure-Compiler to rename
        this.expires = expires
        this.accessPath = accessPath
        this.rawValue = ""
        this.fields = new Array()
        this.fieldnames = new Array() 
        if (arguments.length > 3) { // field name(s) specified
              j = 0
              for (i = 3; i < arguments.length; i++) {
                    this.fieldnames[j] = arguments[i]    
                    j++
              }
              this.fields.length = this.fieldnames.length 
        }
        this.read = ucRead            // function assignments
        this.write = ucWrite
        this.remove = ucDelete
        this.get = ucFieldGet
        this.put = ucFieldPut
        this.namepos = ucNamePos
        this.read()
  }; // cookieObject

UC功能典型地被构造是这样的:

  var ucRead = function () {
        var search = this.name + "="
        var CookieString = document.cookie
        this.rawValue = null
        this.found = false
  }

我已阅读如何“这”一个JavaScript中的关键字工作对象的文字? 以及关闭编译器警告危险的利用全球的“这个”对象? 和范围在JavaScript中 。 但是,我还是不明白的范围this是在上面的代码,也没有我怎么会去重写这段代码,以消除编译器警告。

Q1:有人可以澄清我的范围是什么this是什么?

Q2:有人可以提供一些代码片段展示了如何上面可以重写,以消除编译器警告(我假设使用this有被淘汰)?

TIA。

Answer 1:

范围this本质上是不可预测的。 this引用任何情况下在该函数被调用特定的呼叫 。 例如:

var foo = function()//or function foo()
{
    console.log(this);
};
foo();//logs the window object
var anObj = {name:'someObject',method:foo};
anObj.method();//logs `anObj`

基础知识很简单:

[[someObject]].function();//call func
    /\            ||
    ||  implicit  ||
    |______________|

在IRST例如没有明确的所有者对象,所以JS回落到全局对象,默认情况下。 (除非在使用strict mode )。 第二个例子,FOO用作方法中,从对象调用,所以this引用该对象。

现在,这一切都是很容易的,但考虑到this基准临时决定的,功能在JS 松散结合Array.prototype.slice.apply(arguments,[0]); ),谁也不能保证, 始终指向你希望它指向的东西。
ECMAScript的5为您提供的bind方法为,使您能够结合给定情况下,以一个函数对象,但不要忘了:有一些讨厌的人在那里谁仍然使用过时的浏览器。
此外,这是一个“问题”,这已经有很长一段时间,人们使用了各种解决方法。 最简单的就是使用闭包:

var MyConstructor = function()
{
    "use strict";//in strict mode, this'll throw errors when called without new keyword
    if (this === window || !this)
    {
        throw 'Omitted new keyword in older browsers, that don\'t support strict mode';
    }
    var that = this;//create closure reference to the new instance
    that.someProperty = 'Use that instead of this';
    that.especially = function()
    {
        console.log(this === that);//see later
        console.log('especially in methods, because they can be borrowed, at which point `this` could reference anything, but here: ' + that + ' Will always be what you expect');
    };
}
var foo = new MyConstructor();
foo.especially();//logs true, and 'especially in methods ...'
bar = [];
foo.especially.apply(bar,[]);//logs false, but the second log will still be the same


文章来源: JavaScript “this” keyword and Closure Compiler warnings