2016-06-12 145 views
-3

代碼1:??什麼是「這」意味着這些代碼之間的區別

 var name = "The Window"; 
 
  var object = { 
 
    name : "My Object", 
 
    getNameFunc : function(){ 
 
      return function(){ 
 
        return this.name; 
 
      }; 
 
    } 
 
  }; 
 
  alert(object.getNameFunc()());

它提醒 「窗口中的」

代碼2:

var name = "The Window"; 
 
  var object = { 
 
    name : "My Object", 
 
    getNameFunc : function(){ 
 
      var that = this; 
 
      return function(){ 
 
        return that.name; 
 
      }; 
 
    } 
 
  }; 
 
  alert(object.getNameFunc()());

它提醒 「我的目標」。

我知道代碼2重命名爲「this」這個「that」。但我不知道爲什麼代碼1提醒「窗口」。

+0

我的回答有用嗎?或者您需要更多信息? –

+0

非常感謝,它確實有幫助。 –

+0

然後你就可以接受並註冊它... –

回答

1

大量關閉答案澄清範圍如何JavaScript的作品!但我確實有一個關於你的代碼的問題:

爲什麼兩個返回語句在你的函數中?

陳述中你的函數,即

return function(){ 
    return this.name; 
} 

是錯誤的,它cuase首先獲得您的弗朗功能,目前的範圍,即窗口/文件返回。因此內部語句實際上被稱爲當前範圍,因此返回「The Window」!

insted的你只需撥打

return this.name; 

沒有包裝的功能,現在它會導致它在對象範圍內返回返回「對象」!

0

提示「本」: this指向當前上下文的對象(而不是函數)。

所以這裏方面是很重要的。

所以 在編碼1 - this是匿名函數裏面,因此它在全球範圍內,所以在這裏,它指向window對象。 即 這裏它將打印:window.name = The Window

在碼2 - this是創建object所以它在object上下文實例函數內部,所以在這裏,它指向object

即 這裏會打印:object.name = My Object

希望這將有助於:)謝謝:)

+0

那麼,這裏的'function(){return this.name}'在全局上下文中,'this'指向window,'var name'等價於'window.name'? –

+0

是的,因爲聲明不在任何函數內,這意味着它在全局範圍內聲明。 而所有的全局變量都屬於窗口對象,所以這裏'window.name'指向'var name'。 –

-1

這可能是關於「關閉」的問題,你可能想看看這個: How does closure work

在代碼1中,this在設備下,所以它直接指向設備的名稱。

而且var name這裏是全球var.So你會得到The Window

+0

謝謝你的回覆 –