2012-08-02 74 views
0

我知道變量是其他對象的屬性。例如:函數中的局部變量

var myVar = 'something'; 

窗口對象的性質(如果它是在過程的全局範圍)。

如果我想找到變量的對象,我只需使用這個變量。但是:

function f() { 
    var myVar2 = 'something'; 
} 

哪些對象不myVar2屬於? (myVar的屬於窗口對象,但對於myVar2?)

我想知道,謝謝。

+3

「我知道變量是其他對象的屬性」 - 這是不正確的。 – zzzzBov 2012-08-02 01:16:30

+1

優秀的答案:http://stackoverflow.com/a/101089/1048572,你可能會對[在範圍內獲取所有變量]感興趣(http://stackoverflow.com/q/2051678/1048572) – Bergi 2012-08-02 01:29:18

回答

2

它不屬於一個對象。它屬於功能f的範圍。你可以通過myVarf之內訪問它。您不能在f以外訪問它。

如果你沒有

function f() { 
    this.myVar = 1; 
} 

現在你可以做

var myF = new f(); 
myF.myVar 

事實上,這如何用戶定義的對象有時定義。

+0

但根據這:http://11heavens.com/everything-is-a-property-of-an-object-in-javascript 一切都是一個對象的屬性。 – 2012-08-02 01:17:52

+1

根據某些人{}也被稱爲json對象。 – hvgotcodes 2012-08-02 01:22:13

+1

你應該在你的問題中鏈接該網站。不,這篇文章的作者是錯誤的。 – Bergi 2012-08-02 01:23:47

0

myVar2屬於本地範圍(f)和myVar全球範圍。

0

var做了一些有趣的事情。 var語句被提升到其功能範圍的頂部。該var的功能範圍是什麼功能,它正好是在

JavaScript沒有塊級的範圍,這意味着:

(function() { //a closure to create new scope 
    var foo; 
    foo = 1; 
    if (condition) { 
     var bar; 
     bar = 3; 
    } 
}()); 

...等價於...

(function() { 
    var foo, 
     bar; 
    foo = 1; 
    if (condition) { 
     bar = 3; 
    } 
}()); 

如果var語句沒有父母,這反而增加了變量作爲一個屬性來全球範圍內,這在Web瀏覽器恰好是window

這是只有時間,使用var將創建一個屬性。如果想創建一個對象的屬性,你只需要設置:

(function() { 
    var foo; 
    foo = {}; 
    foo.bar = 'baz'; //this creates the `bar` property on `foo` 
}()); 

JavaScript是一種原型的語言,原型繼承。函數是一流的對象(因爲JavaScript不是針對函數的種族主義)。這意味着函數可以像任何其他對象一樣使用。

你可以將它們設置:

(function() { 
    var foo; 
    //foo is now a function 
    foo = function() { 
     alert('Hello World'); 
    }; 
}()); 

您可以將它們設置屬性:

(function() { 
    var foo; 
    foo = function() { 
     alert('Hello World'); 
    }; 
    foo.bar = 'baz'; //this works just fine 
}()); 

,你甚至可以將它們作爲參數:

(function() { 
    var foo, 
     bar; 
    foo = function() { 
     alert('Hello World'); 
    }; 
    bar = function (c) { 
     c(); 
    }; 
    bar(foo); //guess what this does? 
}()); 

另一個很酷的事情,其功能那麼,他們是作爲構造函數嗎?所有的功能本身的構造函數,你只需要使用new關鍵字打電話給他們:

(function() { 
    var foo; //case sensitive 
    //it doesn't matter whether you use `function Foo` 
    //or `var Foo = function...` 
    function Foo() { 
     alert('Hello World'); 
    } 
    foo = new Foo(); 
    foo.bar = 'baz'; 
}()); 

重要細節在使用構造是函數的上下文(this)將被設置爲通過構造函數創建的對象。這意味着您可以在構造函數中設置對象的屬性:

(function() { 
    var foo; 
    function Foo() { 
     this.bar = 'baz'; 
    } 
    foo = new Foo(); 
    alert(foo.bar); //'baz' 
}()); 
+1

我想OP想知道[範圍變量對象](http://es5.github.com/#x10),而不是提升和一流功能: - | – Bergi 2012-08-02 01:37:55