2013-02-14 56 views
0
var a,b,c; 

function abc(a,b,c){ 
    console.log("a is"+ a + ", b is"+ b + ", c is"+ c); 
} 

a; // undefined 
b; // undefined 
c; // undefined 

我將通過串abc,但想也能夠訪問他們,一旦他們是通過函數傳遞。JavaScript的參數值傳遞到同名外部範圍變量

所以,如果我叫abc("d","e","f"),我想該功能使用這些三串運行,但事後,自己的範圍之外,我還希望能夠使用a="d"b="e"f="f"

有人可以解釋這是怎麼完成的?我認爲,即使他們被宣佈在功能之外,但它的名字相同的事實正在拋棄我。

我記得在PHP有關添加&參數之前的東西...

謝謝!

+0

你說得對名稱是相同的。參數變量「陰影」是外部範圍內的變量。 – 2013-02-14 23:49:49

+0

你爲什麼想要這種行爲?它給你的代碼一種氣味。 – 2013-02-14 23:53:35

回答

3

我不知道你問這裏有什麼,但像你想它,它工作得開箱。

由於ECMAScript中有功能範圍,變量abc將得到本地的abc()的功能範圍內解決。這些 變量名聲明(讓我們稱之爲自由變量),永遠不會訪問,因爲查找過程將首先在其* 自己方面發現這些名字,解決這些問題並停止。

如果你只是想設置這些自由變量這是一個父上下文的一部分,你可能應該重命名形式參數爲了方便,然後越過值

function abc(some, other, name) { 
    a = some; 
    b = other; 
    c = name; 
} 

希望父範圍其中a,bc被聲明不是全球範圍。這是非常正確的仍然被認爲是不好的做法和業力,有幾個原因。

+0

啊哈!好的,所以如果我明白你在說什麼,我可以不同地命名參數,並將變量名稱設置爲函數中的參數?! – 2013-02-14 23:48:14

+1

@iight:是的,那將是我猜測的最方便的方式。 – jAndy 2013-02-14 23:49:14

+0

謝謝@jAndy! – 2013-02-14 23:52:44

1

如果外部作用域中的變量被具有相同名稱的函數參數掩蓋,則不能使用這些變量。

你可以,如果他們被命名爲屬性一個變量是在外部範圍。在瀏覽器中,全局變量實際上只是window變量的性質:

var myobj = {}; 

function abc(a, b, c) { 
    myobj.a = a; 
    myobj.b = b; 
    myobj.c = c; 
} 

// you can now use those values 
2

最好的做法是給內部變量不同的名字,例如通過在它們前面添加'內部'或函數名稱的首字母。您不僅可以簡單地使用簡單的a = innerA將值分配給外部變量,還可以使您的代碼更具可讀性。

1

首先,我想你的意思是:

var a, b, c; 

function abc(_a, _b, _c) { 
    a = _a; 
    b = _b; 
    c = _c; 
} 

abc(1, 2, 3); 
console.log("a is"+ a + ", b is"+ b + ", c is"+ c); // 1, 2, 3 

既然說了,我覺得這種做法是不是一個好的做法。請在閉包或命名空間內組織它們。例如,下面是一個可接受的設計模式:

(function(g) { 

    var _SomeClass = function(a, b, c) { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
    } 

    _SomeClass.prototype = { 
     printValues: function() { 
      console.log(this.a, this.b, this.c); 
     }, 
     doSomething: function() { 
      // do something here 
     }, 
     _privateMethod: function() { 
      // should not be called from outside the closure 
     } 
    } 

    g.SomeClass = _SomeClass; 

})(window); 

var myClass = new SomeClass(1, 2, 3); 
myClass.printValues();