先给答案,在去测试。
一:undefined
解释,开始 a 为 undefined,但 undefined 当然存在于 window 中,So...
二:1
解释,方法a只能在a方法内使用a调用,即a(),其它域使用b(),以a作为b方法的方法名。
三:方法a
解释,var a; 仅是定义,并无赋值。
四:10
解释,输出arguments每个值都与参数有引用关系,以前无聊时测试过。
五:window
解释,a()/a.call()/a.call(null)无区别,经验。
一:undefined
解释,开始 a 为 undefined,但 undefined 当然存在于 window 中,So...
二:1
解释,方法a只能在a方法内使用a调用,即a(),其它域使用b(),以a作为b方法的方法名。
三:方法a
解释,var a; 仅是定义,并无赋值。
四:10
解释,输出arguments每个值都与参数有引用关系,以前无聊时测试过。
五:window
解释,a()/a.call()/a.call(null)无区别,经验。
2.1
3.function a (x) {
return x * 2;
}
4.10
5.[Object window]这个还真不知道为什么
Animal.call(this,color,age);
}
2.不知,逗号表达式是顺序还是倒序执行没研究过
3.function......
4.3,因为a是值类型,不会影响参数变量a
5.异常?调用null的toString方法应该会抛出异常吧
var a ;
if (!("a" in window)) {
a = 1;
}
alert (a);
所以if语句判断通不过为 undefined
2,不知道
3,只知道JS对已经赋值过的变量再次定义无效,所以是function(){。。}
4,第一直觉是10,不能确定,因为js所有函数在接受参数的时候实际就是arguments对象
x,y,a 只是该对象的引用而已。
5,不清楚,不过看了上面的恢复应该是this 就是a(); this就是window吧这个当记住了
function a (x) {
return x * 2;
}
var a = 10;
alert (a);第三题改成这样是否可以测试预编译的时候是先function还是先var?
var a = 1;
}
alert (a);这样的题目 见一次 喷一次
这里的意思是判断 window中是否有属性 a?没有 则 在window下声明a(不知我理解的对不)
所以 本身写的就是错误的代码 那要测试什么呢?对错误意思的错误理解?
难道不应该这样写 if(!('a' in window)){ window['a'] = 1 }
错误的写法,不规范的写法,引起混乱的逻辑
1,2,3,4 全是这样的类型
这4个写法 生产环境中会碰见不?应该出现吗?只有 最后一题 还勉强算可以用来测试
这个code其实会被这样执行
var a;
if(!('a' in window)) {
a = 1;
}
alert(a);其实这些题目是否会出现实际生产过程中 我就不回答了,只是想说明下,这些题目本身只是一种测试 只是把问题极端化,边缘化。
http://baike.baidu.com/view/648413.htm
这样,上面的a就不要想成通常的变量,把它当成一个函数
于是,很正常的出现了对闭包的需求:当一个函数被传出一个作用域以后,又没有事先声明(这种时候外面环境根本不知道传出来的是啥,不能事先声明),如果让这个函数可用?这就是所谓 闭包的价值 吧受益于楼主此贴的启发
非常感谢。
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。
只能说你对js一点都不了解。用 var a申明的变量与window['a']是有区别的。前者不能用delete删除的,而后者可以。可能是先入为主的关系,很多人对js的弱类型以及它的解析方式不习惯不了解。还有很多人认为它不安全又简单,所以造成的误会很大。
b = function a (x) {
x && a (--x);
};我且请教下各位
上面的写法代表了 js的特性吗?
你写出过这样的代码吗?
你允许这样的代码吗?
你的公司的生产环境允许这样的代码吗?如果没有 我干嘛要去理解
我也不知道 我是不是理解闭包 理解什么特性
但是我们写代码更注重的是规范性 合理性 一致性
一次性声明
预先初始化
正确使用
及时释放
这个是跨语言的形式把我们是要用我们的代码让世界更美好
呵呵 上面都是乱说的(其实是赚更多的钱)写了几年代码 感觉自己开始胡言乱语了 大家可以更猛烈热情一点 js的时代就要来了
function expression;
arguments;第5个不能简单的回答的,得看context,
如果是 strict mode,那就alert null;考虑下面的代码:
"use strict"
function a(){
alert(this);
}
a.call(null);
如果不是 strict mode,那才this本身的指向。
第5个 我就认为null就是没有,所以因为a函数形式中并无上下文对象 没有就是引用global对象了,手册上讲的
如果在函数体外部调用call()方法,如果传入null则默认转成window,如果不传也是一样.
由此推断call()方法内部构造类似如下代码:
function call(scope) {
if(!scope) {
scope = window;
}
}
把最后一片代码改一下就大致可以看出一些倪端
function a () {
alert (this === window);
}alert(this === window); // true
a.call (); // true
a.call (null); // true
a.call (this); // true
a.call (window); // true
a(); // truenew a(); // false
如果new了一个函数,则函数体内的this就是它自身了
这个地方,不是测试谁先定义的问题吧?定义是按照顺序的啊。function 也是定义,var 也是定义。应该是顺序的。但是这地方,应该疑问点可能和java的定义和实例化有类似。var a,只是定义,但是并没有实例化,而如果a已经被定义过。二次定义,a的指针还是指向刚开始的function吧。我感觉这个问题要告诉我们的就是这个。
if (!("a" in window)) {
var a = 1;
}
alert (a);js所谓的作用域只有函数,大括号({})不属于作用域。在执行JS的时候,会先预编译一下要执行JS的代码。因为变量a在下面已经定义了,所以"a" in window为true,加个非就为false,所以结果为undefined。等效代码。var a;
if (!("a" in window)) {
a = 1;
}
alert (a);2.Function
3.undefined
4.3
5.window菜鸟默默的飘过