JavaScripts中匿名函数中的参数变量
Parameter variable in anonymous function in JavaScripts
我在Mozilla的JavaScripts教程中遇到了这个问题,我似乎无法理解。我读了很多堆叠式的问题,但找不到答案。下面给出了一个代码片段。
var createPet = function(name) {
var sex;
return {
setName: function(newName) {
name = newName;
},
getName: function() {
return name;
},
getSex: function() {
return sex;
},
setSex: function(newSex) {
if(typeof newSex == "string" && (newSex.toLowerCase() == "male" || newSex.toLowerCase() == "female")) {
sex = newSex;
}
}
}
}
var pet = createPet("Vivie");
var pet2 = createPet("Sam");
pet.getName(); // Vivie
pet2.getName(); // Sam
createPet
似乎只返回函数对象的映射,但在任何地方都没有提到变量name
,但不知何故,pet
和pet2
的行为就像一个类的对象,其中有一个名为name
的成员变量和一堆名为getName()
、setName()
等的成员函数。这是如何工作的?
name
是createPet()
函数的参数。它的工作方式与局部变量sex
相同,并且表现为仅可由createPet()
内部声明的函数访问的私有成员变量。name
被传递到createPet()
中,但它也可以从createPet()
中设置,并且由于返回对象中的函数创建的闭包都引用了name
参数,所以它在执行createPet()
时仍然存在。
name
被定义为类似于function( name /*<-- there it is */)
的形式参数。
所以想想:
= function( name ) {
var sex;
};
As:
= function() {
var name = arguments[0];
var sex;
}
它们确实是完全相同的,或者至少有效地是相同的。
是的,createPet
返回了一个混杂闭包的哑映射。事实上,你可以这样做,并看到它仍然有效:
var a = createPet("Vivie");
var asd = a.setName;
asd("asd");
a.getName() //"asd"
这是因为对象几乎是不相关的,是承载数据的函数而不是对象。该对象只是一个函数(闭包)的哑映射。
您也不会处理对象属性,而是处理变量。你不能假装变量是对象属性,除非它是一个全局变量,实际上不是变量,而是全局对象的属性:
- 属性可以枚举、动态访问、删除并保持不变
- 只要您有对对象的引用,就可以在任何地方访问属性
除此之外,整个模型是向后的。你有携带数据的行为,而不是携带行为的数据。
当然,你根本不必这么做,明白吗https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Details_of_the_Object_Model.
- 函数参数中的数据与指定变量之间的任何性能差异
- 参数变量出现ngTable指令问题
- 我不能使用变量作为javascript参数
- HTML 按钮点击函数无法使用 jQuery 变量作为参数
- 从带参数的字符串变量调用函数中的函数
- 如何使用jQuery插件参数变量
- JavaScripts中匿名函数中的参数变量
- 是否可以将参数/变量传递给Onblur函数
- 使用参数变量获取传递给 ES6 箭头函数的参数
- 更改没有返回和全局变量的“参数变量”
- JavaScript:为什么更改参数变量会更改“参数”“数组”
- 如何通过参数变量更新对象的属性值
- 如何转义要在语句中使用的JavaScript函数参数变量
- 参数变量在JavaScript中创建闭包
- 如何得到$.获取jquery动态参数变量
- 如何通过名称空间变量进入点击函数参数变量?jQuery
- 如何将动态参数/变量添加到使用ng-bind-html或自定义指令呈现的模板中(在ng-repeat中)
- 可以't似乎将JS参数(变量)传递给Google Map API v3函数
- 无法访问.数据中的参数变量:铁路由器中的属性
- 通过JQuery Load从PHP获取或post传递函数参数变量