JScript的语法教程里面说在声明变量时忽略var关键字是完全合法的
但是事实常常又证明想当然的结果是不可靠的
看看下面这几个例子的结果就知道问题了
这三个例子的执行结果分别是
复制代码 代码如下:
Results#region Results
No
undefined
No
No
undefined
#endregion
原 来JavaScript的变量也是有作用域的只是它非常的笼统就分为全局变量和函数变量在第二个例子中得到和是因为所有的变量都是全局变量 而且那个语句块一共就定义了两个变量而第一个第三的函数外全局变量确实说明var关键字有没有都没有关系而函数内的var关键字就很关键了它说明 第二个var是函数内的变量所以在初始化var前输出自然就是undefined了
那么函数里面是不是就屏蔽掉了全局的 var了呢?我们知道在C/C++可以使用::去访问全局变量那么JavaScript可不可以呢?这里其实我们只要明白了全局变量到底是什么东 西就好弄了原来全局变量都是动态添加到Window对象的实例window上的属性而以所以我们只要在函数内 用documentwrite(windowvar);就可以取到其值了同时在这个上下文中function内的this也是指向的 window实例我们也可以把引用写成thisvar
顺便说一下重看JScript教程时它说变量只能是[azAZ_]+[azAZ_]*格式可是$却也可以作为变量名字符而且还可以用在开头比如$更甚至于$$$ 也是合法的变量名faint
我想知道是不是在调用一个函数时程序执行顺序会先检查函数内部变量中有没有关键字var 然后中再根据检查结果给不同的变量付予不同的作用域和变量值因为我看到在这三个函数中var变量都是在输出语句之后
复制代码 代码如下:
function get_global_var(___name)
{
return eval(___name);
}
function set_global_var(___name
___value)
{
eval(___name+"=___value");
}
var aa=
;
Test();
WScript
Echo(aa);//
function Test()
{
var aa=
;
WScript
Echo(get_global_var("aa"));//
set_global_var("aa"
);
WScript
Echo(get_global_var("aa"));//
WScript
Echo(aa);//
}
在上面的例子中this从来就没有指过Test而一直都是WScript的实例
如果我们写一个语句var test = new Test(); 这时Test里的this就是指的Test的一个实例了这个实例中如果要使用Global的变量Lostinet给出的是一个方法
不过最简单还是把global传入对象这样定义Test
复制代码 代码如下:
function Test(global)
{
//
}
然后这样创建实例var test = new Test(this); 就可以在Test实例中使用global的对象和属性了
是不是这样在new的实例中this就指实例否则都指WScript?如果这样的话换了脚本引擎是不是情况又会不同?这个是标准吗?
new constructor[(arguments)];
new 运算符执行下面的任务
·创建一个没有成员的对象
·为那个对象调用构造函数传递一个指针给新创建的对象作为 this 指针
·然后构造函数根据传递给它的参数初始化该对象
要注意的是即使当前作用域内没有调用new但可能在其父作用域里是调用了new的所以“在new的实例中this就指实例否则都指WScript?”前半句对而后半句不一定