窗口上的Javascript获取程序/设置程序
为什么在Firefox21.0中出现以下类型的错误窗口上的Javascript获取程序/设置程序,javascript,Javascript,为什么在Firefox21.0中出现以下类型的错误 Object.defineProperty(window,'windowProperty',{ get: function(){ return 'windowProperty' }, set: function(val){ console.log('windowProperty is being set'); }, configurable: true, }); va
Object.defineProperty(window,'windowProperty',{
get: function(){
return 'windowProperty'
},
set: function(val){
console.log('windowProperty is being set');
},
configurable: true,
});
var windowProperty;
但在不使用var的情况下声明windowProperty是有效的:
windowProperty;
或
spidermonkey中也存在此行为:
var a=1;
Object.defineProperty(this,'a',{
get: function(){
return 'a';
},
});
只写
windowProperty;
不声明变量。它只是尝试返回最近上下文中的变量内容,如果找不到,则返回未定义的变量内容。这就像一个没有目标的任务。例如,您还可以编写随机文本而不引发错误:
'Hello, world !';
123456;
undefined;
相反,使用var尝试重新定义以前在代码中定义过的属性,因此会出现错误
编辑正如simonzack所指出的,浏览器在重新定义变量时并不总是发送错误。例如:
var test; var test;
不会抛出此错误(即使这是一个坏主意,一些JS验证器会警告您)。但是,通过定义getter和setter,浏览器会“锁定”此属性(例如,为了防止冲突,同一属性上有两个不同的setter)。我的错,这是一种误解
有什么理由要重新定义变量吗
编辑2考虑到
var
声明在defineProperty
之前,它允许我的解释更加精确。实际上,当您第一次使用var
声明时,浏览器会将其可配置
状态设置为false,从而防止对其描述符()进行更改。因此,当您尝试使用defineProperty
函数更改它时,会导致错误。一个更好的例子是将代码包装在闭包函数中。这样,由var
定义的windowProperty就不一样了,一切都正常
(function () {
var windowProperty;
Object.defineProperty(...);
//It works because the previously defined variable is in the scope of the function and thus is not the same as window.windowProperty.
})();
您正在尝试使用哪个浏览器?我试过chrome和Firefox,没有看到类型错误。IE中一切正常。你的问题是什么?更新后,我的问题不是针对IE,而是针对Firefox根据你的逻辑,
var测试;var检验
应该抛出一个错误,但不会。@simonzack你是对的,我答案的第二部分不完整。这是因为您为该属性定义了访问器(get
和set
),因此浏览器将其“锁定”。我将更新我的答案。如果可配置设置为false,浏览器实际上只“锁定”属性。检查mozilla文档:。这和“var”有什么关系?我没有这样说“lock”。将configurable设置为true后,您确实可以替换get&set属性或删除此属性,但在它存在时,您不能再次定义它。不管怎样,你为什么要这么做?我不明白var windowProperty的用法代码>我这样做是因为在这种情况下,我不确定为什么在这种情况下它的行为与window.windowProperty
不同。而你的答案并没有说明“重新定义”对能手/二传手意味着什么。你能给我看一下这些文件吗?我找不到。顺便说一下,var windowProperty
实际上是在defineProperty
之前运行的,我认为您没有意识到这一点。
(function () {
var windowProperty;
Object.defineProperty(...);
//It works because the previously defined variable is in the scope of the function and thus is not the same as window.windowProperty.
})();