是否有可能在Javascript中检测重复的功能(在某些情况下可能会意外写入)?在Google Chrome中,
printLah(); //this prints "Haha" for some reason, without even printing an error message in the Javascript console!
function printLah(){
alert("Hahah!");
}
function printLah(){
alert("Haha");
}
Run Code Online (Sandbox Code Playgroud)
简短的回答是,不,不是.
这就是javascript的工作原理.函数名称只是一个分配了函数的变量.例如:
function foo () {
alert('foo!');
}
foo = 1;
foo();
Run Code Online (Sandbox Code Playgroud)
上面的代码会生成错误,因为数字不是函数!函数名和变量名之间没有区别.实际上,定义函数的另一种方法与您定义变量的方式完全相同:
var foo = function () {
alert('foo!');
}
Run Code Online (Sandbox Code Playgroud)
这是因为这样,JavaScript不能防止重新分配,否则你不能重新分配变量函数,作为一类对象的行为(在另一方面纯函数式语言有禁止可变重新分配没有问题).
解决方法和最佳实践:
这就是人们一直说你不应该在javascript中定义太多全局变量的原因.这包括功能.否则它可能会与其他人的代码发生意外冲突.
javascript中有两个强大的功能可以缓解这个问题:对象和闭包.
因为javascript支持对象,所以应该使用面向对象的编程来限制程序中的全局变量.与传统的OOP不同,javascript在将对象用作集合或命名空间时效果更好.这是因为javascript没有文件范围,一切都是全局的.
这并不意味着您不应该创建像传统OOP那样封装较小问题的较小对象.它只是意味着,如果可以,您应该在单个父对象中包含所有对象.我并不是指在这里继承,我的意思是在一种关系中.看看像jQuery和Raphael这样的流行图书馆.它们只将一个对象导出到全局范围,以避免与其他人的代码冲突.
但是,这并不能真正保护人们不再重新分配你的对象(因为它们毕竟是变量).例如,您可以通过在HTML文件的顶部执行此操作轻松地破解jQuery,然后其他位的javascript就有机会运行:
jQuery = null;
Run Code Online (Sandbox Code Playgroud)
保护代码不被篡改的方法是使用闭包.第三方代码无法访问您在闭包内运行的任何代码.只要你避免使用全局变量.
| 归档时间: |
|
| 查看次数: |
5051 次 |
| 最近记录: |