Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.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 为什么更改变量名会改变prompt()的行为_Javascript - Fatal编程技术网

Javascript 为什么更改变量名会改变prompt()的行为

Javascript 为什么更改变量名会改变prompt()的行为,javascript,Javascript,使用prompt的一个极其简单的示例如下: <!DOCTYPE html> <html lang="en"> <head></head> <body> <script> var name = prompt("Please enter your name"); if (name != null) { console.log('problem!!!');

使用
prompt
的一个极其简单的示例如下:

<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
    <script>
        var name = prompt("Please enter your name");
        if (name != null) {
            console.log('problem!!!');
        }
    </script>
</body>
</html>
…然后
问题仅在单击“确定”时显示。这怎么可能?为什么更改变量名会改变
提示符
函数的行为?

您可能运行在一个“最好避免”的标识符问题中:

在Chrome和Edge(14)上,由于
提示符
(esc后,取消,x)而试图设置
名称
,导致
名称
被设置为字符串
“null”
,而不是
null
。IE 11将
name
设置为空

但如果您真的按OK,则
name
将设置为您键入的任何内容

其他变量名称实际上设置为
null
,这是esc、cancel、x的结果。

原因是“name”是从全局窗口提升的全局变量。默认值为“”,不为空。 第一个表单定义了名称,即使用户点击cancel(它只是不会重置它)。
第二个表单使用了一个尚未定义的变量,因此如果取消,它将获得null值。

name
窗口上的全局变量
var name
不会重置或重新声明它。它仍然是指
窗口.名称

并且不能设置
window.name=null
。 DOM将改为
“null”
,因为它必须是DOM规范中的
字符串

var name;
console.log( typeof name ); //<- you got "string here"
name = null;
console.log( typeof name ); //<- you still got "string here"
console.log( name );        //<- you got string "null" not null

有关详细信息,请参见此

此处您正在全局范围中创建
名称
变量,但
窗口
范围中已存在
名称
属性,这是默认范围。您可以使用

Object.getOwnPropertyDescriptor(window, 'name')
在这里,您可以看到名称有自己的
getter
setters
,因此,即使您给它赋值,它的setter也会将其转换为字符串。因此

name = 34; // will save '34' to it not Integer
其中,与第二种情况一样,
randomNumber
变量未在
global
window
范围内定义,因此该变量按预期工作

在您的情况下,
name
被设置为
null
,但被保存为
string
,即

name; // 'null'
因此,如果
没有得到正确执行,您的


有关
窗口
名称
属性的详细信息,请阅读。

您应该使用
真/假
或空字符串
name = 34; // will save '34' to it not Integer
name; // 'null'