gpt4 book ai didi

javascript - 为什么在创建作用域时将参数传递给匿名函数

转载 作者:数据小太阳 更新时间:2023-10-29 05:18:12 25 4
gpt4 key购买 nike

抱歉,标题很烂,但我想不出更好的了。

Polymer 中的 ShadowDOM.js 文件执行此操作:

(function(scope) {
"use strict";
var unsafeUnwrap = scope.unsafeUnwrap;
var wrap = scope.wrap;
var nonEnumDescriptor = {
enumerable: false
};
function nonEnum(obj, prop) {
Object.defineProperty(obj, prop, nonEnumDescriptor);
}
function NodeList() {
this.length = 0;
nonEnum(this, "length");
}
NodeList.prototype = {
item: function(index) {
return this[index];
}
};
nonEnum(NodeList.prototype, "item");
function wrapNodeList(list) {
if (list == null) return list;
var wrapperList = new NodeList();
for (var i = 0, length = list.length; i < length; i++) {
wrapperList[i] = wrap(list[i]);
}
wrapperList.length = length;
return wrapperList;
}
function addWrapNodeListMethod(wrapperConstructor, name) {
wrapperConstructor.prototype[name] = function() {
return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));
};
}
scope.wrappers.NodeList = NodeList;
scope.addWrapNodeListMethod = addWrapNodeListMethod;
scope.wrapNodeList = wrapNodeList;
})(window.ShadowDOMPolyfill);

简单的问题:为什么要传递参数window.ShadowDOMPolyfill

是的,这是一个立即执行的匿名函数。是的,所有变量都将保留在函数内,避免污染。是的,scope 将与 window.ShadowDOMPolyfill 相同。

这是我见过很多次的模式。我完全理解为什么最好不要用变量等污染全局范围。但是,为什么要将 window.ShadowDOMPolyfill 作为第一个参数传递?据我所知,Window 对象在函数中是完全可用的……所以上面的代码和:

(function() {
"use strict";
var scope = window.ShadowDOMPolyfill;
...
})();

...?

最佳答案

在参数列表中定义函数需要的参数以完成分配给它的工作被认为是一种很好的做法。

虽然完全有可能按照您建议的方式进行,但它鼓励使用说谎的 API,从某种意义上说,您无法查看函数签名并理解函数中的内容。

在这个特定实例中,这两个示例在功能上是相同的,但是,假设有更多的参数,并且它们的用法和定义分散在函数体中。

(function(oneThing, anotherThing, aThirdThing) {
...
})(window.oneThing, window.anotherThing, window.aThirdThing);

更具可读性
(function() {
... // with your vars somewhere inside.
})();

在您的示例中,您必须与开发人员强制执行约定,始终将这些定义放在顶部,以保持可读性。但是,该语言已经帮助您使用参数列表强制执行此操作。

关于javascript - 为什么在创建作用域时将参数传递给匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36999462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com