JavaScript 的核心,闭包和作用域
2015-08-11 19:11
489 查看
参考:JavaScript 的核心,闭包和作用域
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
答案如下:
第一题:if (!(“a” in window)) {
var a = 1;
}
alert (a);
分析:首先会解析所有函数,其次是var声明的变量,但是不会赋值(明白?)。因为javascript没有块的概念。像for(var i in array)这里的i依然是全局变量。因此,这几行的代码执行顺序是:1.var a;//声明一个变量,但是不会赋值
2.if语句,全局变量相当于window的属性,所以”a” in window为真,取反为假。故不会执行大括号里面的语句。
3.alert(a);//undefined
第二题:
var a = 1,
b = function a (x) {
x && a (–x);
};
alert (a);
分析:我们可以用多个逗号将变量分开定义,而是用一个var。函数表达式类似于局部变量,不会被全局作用域中访问到。
执行顺序:
1.声明两个变量var a,b;并给他们赋值a=1,b=function a(){…};这里的function a是局部变量,外部无法访问到。因此全局a还是1.
2.alert(a);//1
第三题:function a (x) {
return x * 2;
}
var a;
alert (a);
分析:js永远是先解析声明式函数,再解析变量。
执行顺序:
1.解析函数a;
2.声明变量var a;因为a此时没有被赋值,所以它还是指向原来的值。即function a;
3.alert(a);//不言而预。
第四题:function b (x, y, a) {
arguments[2] = 10;
alert (a);
}
b(1, 2, 3);
分析:在函数内部可以引用一个对象,它是arguments类似数组,但不是数组。它代表了函数实际接收参数的集合。可以通过下标对相应参数进行访问。如果修改此对象某些属性,如arguments[index],则被传进来的第index(如果有的话,下标从0开始)变量的值也会被修改。
执行顺序:1.声明一个函数b;
2.执行函数b(1,2,3);因为这里arguments[2]与变量a引用的是一个值,所以当arguments[2]改变时,a也随之改变。
第五题:function a () {
alert (this);
}
a.call (null);
分析:call方法接受多个参数,其作用是借用别人的方法当作自己的方法。这样能保证执行的时候this能够指向自己。call方法的第二个参数到最后一个参数是传给借用过来函数的。第一个参数是借用的对象,如果这个对象为空,那么将会作为全局window对象调用。即函数中的this指向window。
if (!("a" in window)) { var a = 1; } alert(a);
var a = 1, b = function a(x) { x && a(--x); }; alert(a);
function a(x) { return x * 2; } var a; alert(a);
function b(x, y, a) { arguments[2] = 10; alert(a); } b(1, 2, 3);
function a() { alert(this); } a.call(null);
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
答案如下:
第一题:if (!(“a” in window)) {
var a = 1;
}
alert (a);
分析:首先会解析所有函数,其次是var声明的变量,但是不会赋值(明白?)。因为javascript没有块的概念。像for(var i in array)这里的i依然是全局变量。因此,这几行的代码执行顺序是:1.var a;//声明一个变量,但是不会赋值
2.if语句,全局变量相当于window的属性,所以”a” in window为真,取反为假。故不会执行大括号里面的语句。
3.alert(a);//undefined
第二题:
var a = 1,
b = function a (x) {
x && a (–x);
};
alert (a);
分析:我们可以用多个逗号将变量分开定义,而是用一个var。函数表达式类似于局部变量,不会被全局作用域中访问到。
执行顺序:
1.声明两个变量var a,b;并给他们赋值a=1,b=function a(){…};这里的function a是局部变量,外部无法访问到。因此全局a还是1.
2.alert(a);//1
第三题:function a (x) {
return x * 2;
}
var a;
alert (a);
分析:js永远是先解析声明式函数,再解析变量。
执行顺序:
1.解析函数a;
2.声明变量var a;因为a此时没有被赋值,所以它还是指向原来的值。即function a;
3.alert(a);//不言而预。
第四题:function b (x, y, a) {
arguments[2] = 10;
alert (a);
}
b(1, 2, 3);
分析:在函数内部可以引用一个对象,它是arguments类似数组,但不是数组。它代表了函数实际接收参数的集合。可以通过下标对相应参数进行访问。如果修改此对象某些属性,如arguments[index],则被传进来的第index(如果有的话,下标从0开始)变量的值也会被修改。
执行顺序:1.声明一个函数b;
2.执行函数b(1,2,3);因为这里arguments[2]与变量a引用的是一个值,所以当arguments[2]改变时,a也随之改变。
第五题:function a () {
alert (this);
}
a.call (null);
分析:call方法接受多个参数,其作用是借用别人的方法当作自己的方法。这样能保证执行的时候this能够指向自己。call方法的第二个参数到最后一个参数是传给借用过来函数的。第一个参数是借用的对象,如果这个对象为空,那么将会作为全局window对象调用。即函数中的this指向window。
相关文章推荐
- QML中使用JavaScript
- jsp自定义标签
- JavaScript-html标题滚动效果
- ajax dataType:"json"问题
- JavaScript闭包详解
- 如何将json数据传入到Highcharts中的data中
- JS设置cookie、读取cookie、删除cookie
- JavaScript基础学习之-JavaScript权威指南--第八章函数属性方法构造函数
- 有意思的字符串反转(JavaScript)
- js小数点后保留几位方法:toFixed
- js小数点后保留几位方法:toFixed
- javascript要点整理(一)
- js模块化编程(二):AMD规范
- js模块化编程(一):模块的写法
- js中2个等号与3个等号的区别
- 闲来js基础-----2
- JavaScript基础学习之-javascript权威指南--第八章函数闭包
- JS获取当前时间的方法
- 【草稿】JS中如何操作时间
- JavaScript Puzzlers (试题)