我创建了一个加密对象,如下所示:
var crypto = {
encrypt: function(s) {
}
};
crypto.encrypt("cat");
我会收到以下错误
未捕获的TypeError:
crypto.encrypt
不是函数
var crypt = {
encrypt: function(s) {
}
};
crypt.encrypt("cat");
这将起作用。我意识到已经有一个内置crypto
对象,因此无法识别我定义的加密对象。
我的理解是,稍后声明的变量将覆盖之前声明的变量。
例如,当我创建如下两个对象时:
var test = {
testing2: function() {
return "there";
}
}
var test = {
testing: function() {
return "hey";
}
}
test.testing2()
,我打电话给test.testing2()
,因为第二个测试变量遮盖了第一个测试变量,所以引发了类似的错误。因此,如果变量影子可用于自创建变量,那么为什么不加密加密货币呢?是否存在这样的情况,即预定义对象的优先级始终较高,因此任何自行创建的对象都不会遮盖窗口对象。我对此表示感谢。谢谢!
答案 0 :(得分:6)
通常,是的,以后声明(使用var
的变量将仅覆盖先前声明的同名var
)。区别在于,在顶层用var
声明的变量将分配给window
属性,而window.crypto
是具有getter但不包含setter的属性:
console.log(
Object.getOwnPropertyDescriptor(window, 'crypto')
);
因此,当您使用window.crypto
分配给var crypto
时,没有设置器,因此什么也没发生。许多其他window
属性的行为方式也相同。
考虑改用const
或let
:
const crypto = {
encrypt: function(s) {
}
};
crypto.encrypt("cat");
或将其放入IIFE:
(() => {
var crypto = {
encrypt: function(s) {
}
};
crypto.encrypt("cat");
})();
您还可以使用use strict
来明确指出错误:
'use strict';
var crypto = {
encrypt: function(s) {
}
};
console.log('successfully defined crypto');
crypto.encrypt("cat");