1.問:js中"1"+2+"3"+4 運算結果是?html
答:1234閉包
js中,字符串和數值相加,獲得的仍是字符串,這裏的結果1234也是字符串。函數
2.問:4+3+2+"1" 運算結果是?this
答:91 (從左至右的運算,前面是數值相加獲得9,再和字符串相加獲得91字符串。)spa
3.問:如下代碼中,結果是?code
var foo = 1; function bar() { foo = 10; return; function foo() {} } bar(); alert(foo);
答:將輸出1. (這裏訪問的是window.foo,而不是bar裏面的foo)htm
4.問:如下代碼中,結果是?對象
function bar() { return foo; foo = 10; function foo() {} var foo = 11; } alert(typeof bar());
答:將輸出function.(var foo = 11 雖然定義放在後面,可是變量會提高,因此最後的結果是function)blog
5.問:如下代碼中,結果是?字符串
var x = 3; var foo = { x: 2, baz: { x: 1, bar: function() { return this.x; } } } var go = foo.baz.bar; alert(go()); alert(foo.baz.bar());
答:3,1.
go = foo.baz.bar; go()此時this指向的是widow. window.x的值是3;foo.baz.bar()此時this指向的是baz,baz.x的值是1.
6.問:如下代碼中,結果是?
var x = 4, obj = { x: 3, bar: function() { var x = 2; setTimeout(function() { var x = 1; alert(this.x); }, 1000); } }; obj.bar();
答:輸出4.
setTimeout方法是掛在window對象下的。setTimeout(匿名函數,time),這裏的匿名函數造成了一個閉包,從而能訪問到外層函數的局部變量。也就是window中的x。(參考)
7.問:如下代碼中,結果是?
x = 1; function bar() { this.x = 2; return x; } var foo = new bar(); alert(foo.x);
答:輸出2.
這裏的this指向的是bar的對象實例。
8.問:如下代碼中,結果是?
function foo(a) { alert(arguments.length); } foo(1, 2, 3);
答:3.
9.問:如下代碼中,結果是?
var foo = function bar() {}; alert(typeof bar);
答:undefined
10.問:如下代碼中,結果是?
var arr = []; arr[0] = 'a'; arr[1] = 'b'; arr.foo = 'c'; alert(arr.length);
答:2, 輸出arr的值是["a", "b"],不是很懂這裏的結果。
11.問:如下代碼中,結果是?
function foo(a) { arguments[0] = 2; alert(a); } foo(1);
答:2
12.問:如下代碼中,結果是?
function foo(){} delete foo.length; alert(typeof foo.length);
答:number;foo.length的值仍是0。delete沒法刪除,參考
13.問:如下代碼中,
var name="the window"; var object={
name:"my object",
getName: function(){
return this.name;
} }
經過如下調用
object.getName();
(object.getName)();
(object.getName = object.getName)()
結果是?
答:
第一行的代碼,this指向的就是object,因此毫無疑問;第二行代碼雖然加上括號,就好像只是在引用一個函數,但this的值獲得了維持。由於object.getName和(object.getName)的定義相同。第三行代碼,先執行一條賦值語句,而後再調用賦值後的結果。由於這個賦值表達式的值是函數自己,因此this的值不能獲得維持,結果就返回the window.