这个JavaScript代码的后果
Consequences of this javascript code
我正在阅读John Resig的《JavaScript Ninja的秘密》一书,他在书中解释了如何通过使用以下代码扩展对象的原型来预测语言的未来功能:
if(!Array.prototype.forEach){
Array.prototype.forEach = function(fn, callback){
for(var i = 0; i < this.length; i++){
fn.call(callback || null, this[i], i, this);
}
};
}
现在,我明白了"回调||null"语句阻止将可能的未定义值传递给"调用"函数。我不明白的是将 null 作为"fn"参数的上下文传递的后果是什么。这不会使代码崩溃吗?
感谢您提供的任何解释和/或启发。
这没有"真正的"问题,上下文"this"刚好等于null。这是使用 .call() 或 .apply() 时的一种常见方法,如果您没有上下文的适当值。
Function.call
的第一个参数是运行函数的作用域。如果该参数为 falsey(null
是 false 的一种形式),那么它将在全局范围内运行该函数。在浏览器中,这意味着该函数将在this
设置为 window
的情况下运行。
不需要callback || null
,如果将undefined
作为范围传入,它将使用 window
。尽管可能有一些晦涩的浏览器或情况没有,这可以解释为什么 Resig 这样做。
不,它不会导致崩溃。根据 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call:
[...]如果该方法是非严格模式代码中的函数,则
null
和undefined
将被全局对象替换,并且基元值将被装箱。
(对于网页,"全局对象"是window
。
相关文章:
- 从桌面读取python文件时高亮显示代码
- 如何将函数包装在函数中以避免代码重复
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 货币代码为欧元-金额的格式不应包含小数
- Regex代码只允许一个空格
- 如何将屏幕分辨率乘以 80%,然后在代码中使用
- 从var向代码隐藏函数传递值
- 如何动态插入jquery代码
- 如何在php变量中嵌入JQuery代码
- 代码不会验证
- 如何从rails中的代码中删除新行( )
- Angularjs代码未在匿名函数中运行
- 如何做到这一点,使代码在不传递条件后执行函数
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 面向对象的Javascript代码在IE7中不起作用
- 将 jQuery 代码添加到 Index.aspx 页面
- 为什么忽略了eval()代码中的语法错误
- 元素在我的代码中不会.fadeTo.Don'I don’我不知道;s错误的JavaScript、JQuery、H
- 如何轻松地将服务器端变量从Java代码转移到客户端代码
- 这个JavaScript代码的后果