为什么财产' a'无法从{fn'

时间:2017-01-28 13:19:52

标签: javascript

var red = {a: 2};

red.fn = function(b){
    console.log("A: "+a ", B : "+b);
}

red.fn(20);

这给出了错误:

  

a未定义

但我怀疑a已作为函数fn的全局对象可用,那为什么它不可访问。 任何解释都会有所帮助。

3 个答案:

答案 0 :(得分:6)

因为与其他一些语言不同,this限定符在JavaScript中不是可选的(因为它的工作原理与大多数具有red.fn = function(b){ console.log("A: " + this.a + ", B : " + b); // ---------------------^^^^^ } ; more here的其他语言不同。你需要明确地写它:

+

(你在那里也失踪了php artisan config:cache ...)

答案 1 :(得分:0)

你去吧

var red = {a: 2};

red.fn = function(b){
    console.log("A: "+this.a+ ", B : "+b);    //update this line
}

red.fn(20);

编辑:a可以在fn内首次尝试访问var a = 2,它应该首先被声明为全局变量,例如console.log("A: "+red.a+ ", B : "+b);。 它仍然是一种有效的方式来访问它作为一个全局对象变量,但你应该去this.a

现在,a暗示您正在使用对象的属性(在RobG评论后编辑),其中public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; } 可以访问。

答案 2 :(得分:0)

此处变量a将被翻译为window.a undefined

因此,需要考虑变量a范围。与帖子中的答案中已经提到的一样,我们可以使用this.a来使用封装的变量,或者我们也可以使用red.a

包括几个要进一步探索的例子:

window.a

&#13;
&#13;
a = 5;

var red = {
  a: 2
};

red.fn = function(b) {
  console.log("A: " + a + ", B : " + b);
}

red.fn(20);
&#13;
&#13;
&#13;

object.a red.a

&#13;
&#13;
a = 5;

var red = {
  a: 2
};

red.fn = function(b) {
  console.log("A: " + red.a + ", B : " + b);
}

red.fn(20);
&#13;
&#13;
&#13;

如何将其翻译为以本地功能范围发布

&#13;
&#13;
var red = function() {
  var a = 2;

  this.fn = function(b) {
    console.log("A: " + a + ", B : " + b);
  };
};

var redObj = new red();
redObj.fn(20);
&#13;
&#13;
&#13;