阅读并在这本优秀的书籍Javascript Ninja上取得进展。关于下面的代码的问题虽然,我无法理解为什么使用cb.call的生活以及更多为什么上下文看似空的原因正在传递。我认为它可能刚刚完成了cb(这[i],我,这个)因为'这个'没有被使用。我在这里错过了一个重点吗?请帮忙。谢谢。
<ul id="results"></ul>
<script>
function assert(val,desc){
var li = document.createElement("li");
li.className = val ? "pass" : "fail";
li.appendChild(document.createTextNode(desc));
document.getElementById("results").appendChild(li);
}
if ( !Array.prototype.forEach2) {
Array.prototype.forEach2 = function(cb,context){
for ( var i = 0; i < this.length; i++){
cb.call(context ||null, this[i], i, this);
}
};
}
["a,","b","c"].forEach2(function(value,index,array){
assert(value,"Is in position " + index + " out of " + (array.length - 1));
});
assert(true,"this will be green");
assert(false,"this is RED");
</script>
答案 0 :(得分:1)
在列出的forEach2
的具体示例中,您是对的,上下文(this
)未被使用,因此您可以在实现中执行常规函数调用。如果您不关心在回调函数中具有this
的特定值,那么您可以在此停止并使用常规函数调用。
但是,使用.call
实现并允许传递上下文使您可以选择在某个时候需要时传递特定的上下文值但不要求你如果你不需要它就通过它。意思是,你可以这样做:
var context = {
something: 'hello'
};
['a', 'b', 'c'].forEach2(function(value, index, array) {
// this.something would be 'hello' in this function
}, context);