2.7 提示用户
有时候,不仅仅希望用户回答Yes/No,而是希望得到更特殊的响应。在这种情况下,可以像脚本2-8这样问一个问题(带默认回答),然后接收回复。图2-5显示其结果。
脚本2-8 可以使用对话框询问用户并处理回复
var ans = prompt("Are you sure you want to do that?","");
if (ans) {
alert("You said " + ans);
}
else {
alert("You refused to answer");
}

图2-5 可以提示用户输入一个文本字符串,然后对这个字符串进行操作
提示用户做出响应的步骤如下:
(1) var ans = prompt("Are you sure you want to do that?","");
在这里,声明了一个变量(在第1章中讨论过)。我们使用var关键字声明变量。在这个示例中,变量称为ans,它被赋值为prompt()的结果,也就是用户在提示对话框中输入的文本。
传递给prompt()方法的是由逗号分隔的两段信息(正式的术语是参数,parameter):向用户问的问题和默认回答。这个方法返回用户的响应或null;当用户点击Cancel时,或当没有默认回答而用户点击了OK按钮时,以及当用户清除了默认回答并点击了OK按钮时,就会出现null。有些浏览器会在提示对话框上显示一个关闭控件,使用这个控件也会返回null结果。
(2) if (ans) {
alert("You said " + ans);
}
这个条件语句使用了刚才设置的变量。如果ans存在(也就是说,用户输入了响应),那么脚本弹出一个警告对话框,其中显示You said(请注意这个文本字符串末尾的额外空格)和ans值的拼接。
(3) else {
alert("You refused to answer");
}
如果ans是null(因为用户没有在提示对话框中输入任何内容,或者点击了Cancel按钮),那么执行条件语句的else块,并弹出警告对话框。
ü提示
q 使用var有两种作用:
▲ 它让JavaScript创建一个变量(也就是在内存中为这个新对象留出一些空间)。
▲ 它定义变量的作用域(scope),也就是JavaScript在哪些地方需要知道这个对象的内容(见下栏“作用域是什么”)。如果变量是在一个函数中创建的,那么它是这个函数的局部(local)变量,其他函数不能访问它。如果它是在任何函数之外创建的,它就是全局的(global),脚本中的所有代码都可以访问它。在这个脚本中,我们创建了ans全局变量。
q 在某些浏览器中,如果省略prompt的第二个参数(默认响应),那么一切正常。但是在其他浏览器中,出现的提示对话框中会显示默认值“undefined”。解决方案是总是包含某个默认值,即使是空字符串也可以(就像脚本2-8中一样)。
作用域是什么
在世界上的大多数地方,如果提到Broadway(大道,或特指百老汇),人们都知道你指的是纽约的一条大街。尽管这条大街本身在纽约,但是全世界的人都知道你的意思。可以认为Broadway这个词是全局的。
但是,如果你在加利福尼亚的圣迭戈,当你提及Broadway时,人们会认为Broadway指的是当地市区的一条主要大街。这是一个局部值。在圣迭戈,你指的是局部意义的Broadway,还是全局意义的Broadway,这一点并不明确,因此可能导致混淆。
如果你在圣迭戈,那么默认的是局部意义;在指全局意义时,必须明确地说“纽约的Broadway”。在圣迭戈之外的地方,人们首先会想到纽约的百老汇,除非他们本地也有名为Broadway的大街。
一条大街的作用域(也就是通常所说的范围)是一个地区,在这个地区中这条大街是默认意义;也就是说,如果没有加上其他修饰词,那么提到这条大街的名字,人们就会自动地想到这条大街。圣迭戈的Broadway的作用域是局部的,即圣迭戈市内和附近的郊区。纽约的Broadway的作用域是全局的,即世界上任何地方的人都知道你指的是什么地方。
在JavaScript代码中,要想避免与变量作用域有关的问题和混淆,最容易的方法是避免使用同名的两个变量在不同的地方做不同的事。如果必须使用同名的变量,就一定要弄清变量的作用域!







