[英]Understanding JavaScript closure functions
我是Javascript的新手,對閉包函數有疑問。
在下面的代碼中,我正在創建一個閉包函數,並為同一函數設置新的屬性名。 我想確定所創建函數的屬性-名字-並使用代碼console.log(obj1.firstname);
顯示它。
但是由於某種原因,它顯示為未定義。 請讓我知道是什么問題。
<html>
<head>
<script>
outerfunction = function(firstname,lastname) {
var innerfunction = function (sex) {
console.log(firstname);
console.log(lastname);
console.log(sex)
}
console.log('Initialize');
innerfunction.prototype.firstname = firstname;
return innerfunction;
}
obj1 = outerfunction('Bob','Mcdonald');
console.log(obj1.firstname);
obj2 = obj1('Male');
obj1 = outerfunction('Lucy','Mary');
obj1('Female');
</script>
</head>
<body>
This is the body
</body>
</html>
問題在於您使用原型。 如果您執行innerfunction.firstname = firstname;
應該可以解決未定義的問題。
outerfunction = function(firstname,lastname) {
var innerfunction = function (sex) {
console.log(firstname);
console.log(lastname);
console.log(sex)
}
console.log('Initialize');
innerfunction.firstname = firstname;
return innerfunction;
}
obj1 = outerfunction('Bob','Mcdonald');
console.log(obj1.firstname);
obj2 = obj1('Male');
obj1 = outerfunction('Lucy','Mary');
obj1('Female');
只是評論:
> outerfunction = function
應始終聲明變量,尤其是全局變量,以免它們與具有相同名稱或ID的DOM元素沖突(變量將優先)。 聲明變量后,便沒有必要在函數表達式中進行聲明了(如果沒有其他事情,那就不用多說了,但可以在執行任何代碼之前使函數可用,而不是在進行賦值時) )。 所以:
function outerfunction(firstname,lastname) {
形式參數列表中的項目( firstname , lastname )有效地聲明為局部變量。 因此對於內部功能 :
function innerfunction(sex) {
console.log(firstname);
console.log(lastname);
console.log(sex)
該函數對externalfunction的 名字和姓氏有一個關閉。
> innerfunction.prototype.firstname = firstname;
僅當innerfunction是構造函數時才有用,並且僅當您希望實例繼承firstname屬性時才有用。 函數不是從其公共原型繼承而來,而是從其私有[[Prototype]]
繼承,后者是其構造函數在構造時的公共原型。
> obj1 = outerfunction('Bob','Mcdonald');
這將返回一個內部函數的“實例”,該實例具有對firstname和lastname的閉包。
> console.log(obj1.firstname);
但是firstname 屬性位於obj1.prototype上 (因為這是分配給它的位置),因此找不到(檢查obj1.prototype.firstname
)。
造成混淆的部分原因可能是作用域鏈上的標識符解析(即變量firstname和lastname )與對象及其[[Prototype]]
鏈上的對象屬性解析(即繼承和innerfunction.protoype.firstname )之間的區別 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.