Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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_Ecmascript 6_Ecmascript 5 - Fatal编程技术网

Javascript 为什么不能重新定义属性?

Javascript 为什么不能重新定义属性?,javascript,ecmascript-6,ecmascript-5,Javascript,Ecmascript 6,Ecmascript 5,当我运行以下代码时,会出现错误: TypeError:无法重新定义属性:isBoolean 为什么我不能重新定义这些属性 函数是布尔函数{ var值=参数[0]; if!arguments.length{return;} 如果值===undefined | |值===null{return false;} 如果typeofvalue==布尔值{ 返回true; }否则{ 返回false; } } 函数字符串{ var值=参数[0]; if!arguments.length{return;} 如

当我运行以下代码时,会出现错误:

TypeError:无法重新定义属性:isBoolean

为什么我不能重新定义这些属性

函数是布尔函数{ var值=参数[0]; if!arguments.length{return;} 如果值===undefined | |值===null{return false;} 如果typeofvalue==布尔值{ 返回true; }否则{ 返回false; } } 函数字符串{ var值=参数[0]; if!arguments.length{return;} 如果值===undefined | |值===null{return false;} 如果typeofvalue==字符串{ 返回true; }否则{ 返回false; } } 函数是数字{ var值=参数[0]; if!arguments.length{return;} 如果打开关闭{ 如果值===无穷大{返回无穷大;} } 如果值===undefined | |值===null{return false;} 如果typeofvalue==数字{ 返回true; }否则{ 返回false; } } 函数无序{ var值=参数[0]; if!arguments.length{return;} 返回Array.isArrayvalue; } Object.DefineProperties窗口{ //此类型:{可枚举:false}, isBoolean:{可枚举:false}, isString:{enumerable:false}, isNumber:{可枚举:false}, isArray:{可枚举:false},
}; 因为全局函数声明在窗口的全局对象上创建绑定,所以在可配置标志为false的浏览器上。这将在中介绍,它用于为函数创建绑定,将false作为D标志传递,D标志用于可配置标志。在步骤18.a中,函数名是declaredVarNames的一部分,它来自varDeclarations,通过检索varDeclarations,包括s,其中一个是FunctionDeclaration


由于绑定是不可配置的,因此不能将其可枚举标志从true更改为false。

问题是,当您在全局范围上声明函数时,它已经将其放置在窗口对象上,可配置标志等于false。避免这种情况的一种方法是在另一个函数中定义函数,IIFE的工作原理如下:

您还应该在内部设置props对象的value属性,否则根据文档,该值默认为未定义

作用{ "严格使用",; 函数是布尔函数{ var值=参数[0]; if!arguments.length{return;} 如果值===undefined | |值===null{return false;} 如果typeofvalue==布尔值{ 返回true; }否则{ 返回false; } } 函数字符串{ var值=参数[0]; if!arguments.length{return;} 如果值===undefined | |值===null{return false;} 如果typeofvalue==字符串{ 返回true; }否则{ 返回false; } } 函数是数字{ var值=参数[0]; if!arguments.length{return;} 如果打开关闭{ 如果值===无穷大{返回无穷大;} } 如果值===undefined | |值===null{return false;} 如果typeofvalue==数字{ 返回true; }否则{ 返回false; } } 函数无序{ var值=参数[0]; if!arguments.length{return;} 返回Array.isArrayvalue; } Object.DefineProperties窗口{ isBoolean:{可枚举:false,值:isBoolean}, isString:{可枚举:false,值:isString}, isNumber:{可枚举:false,值:isNumber}, isArray:{可枚举:false,值:isArray}, }; }; 既然您在问题中添加了ecmascript-6标记,我可以建议您在函数表达式中使用let或const吗?与函数语句/声明(其行为大致类似于var)相反,使用let/const声明的全局变量/常量不会成为全局对象窗口的属性

常量isBoolean=函数{ var值=参数[0]; if!arguments.length{return;} 如果值===undefined | |值===null{return false;} 如果typeofvalue==布尔值{ 返回true; }否则{ 返回false; } }; 常量isString=函数{ var值=参数[0]; if!arguments.length{return;} 如果值===undefined | |值===null{return false;} 如果typeofvalue==字符串{ 返回true; }否则{ 返回false; } }; 常量isNumber=函数{ var值=参数[0]; if!arguments.length{return;} 如果打开关闭{ 如果值===无穷大{返回无穷大;} } 如果值===undefined | |值===null{return false;} 如果typeofvalue==数字{ 返回true; }否则{ 返回false; } }; 常量isArray=函数{ var值=参数[0]; if!arguments.length{return;} 返回Array.isArrayvalue; }; 记录“定义属性之前的窗口属性:”; console.log'isBoolean:'+窗口中的isBoolean; 在窗口中记录'isString:'+isString; 控制台。在窗口中记录'isNumber:'+isNumber; 控制台。在窗口中记录'isArray:'+isArray; Object.DefineProperties窗口{ isBoolean:{可枚举:false}, isString:{enumerable:false}, isNumber:{可枚举:false }, isArray:{可枚举:false}, }; 记录“定义属性之后的窗口属性:”; console.log'isBoolean:'+窗口中的isBoolean; 在窗口中记录'isString:'+isString; 控制台。在窗口中记录'isNumber:'+isNumber;
控制台。在窗口中记录'isArray:'+isArray;将所有代码直接作为文本发布到此处。不要链接到代码,当然也不要链接到代码图片。请发布您的代码,不要链接到代码图片。请查看,为什么?为什么我们不能删除全局对象中的函数,但将其覆盖为未定义的函数?@Jonasw:你必须问Brendan Eich,但我认为这是因为函数声明实际上与var声明相同,当然它们马上就有了值,这对他来说没有意义,早在那时你就改变了它们的本质属性。但这只是猜测。这是答案中隐藏的宝石之一。非常详细,直接进入规格。谢谢你这么好的回答。