Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
窗口上的Javascript获取程序/设置程序_Javascript - Fatal编程技术网

窗口上的Javascript获取程序/设置程序

窗口上的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

为什么在Firefox21.0中出现以下类型的错误

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.
})();