1.
var y = 1;
if (function f(){}) {
y += typeof f;
}
console.log(y); // 1undefined
2.
function foo(){
return foo;
}
console.log(new foo() instanceof foo); // false
解析:當函數被當作構造函數調用時,遵從以下3個步驟:
i)、創建一個新的空對象。ii)、新創建的對象作爲this參數傳遞給構造函數,從而成爲構造函數的上下文。iii)、如果沒有顯式的返回值,新創建的對象則作爲構造器的返回值進行返回。
3.// 函數提升(函數在函數內部提升),還有,函數聲明相當於一個local變量,重新聲明瞭一個local變量,名字都叫foo
var foo = 1;
function bar() {
foo = 10;
return;
function foo() {}
}
bar();
alert(foo);
4.
// 變量提升(變量在函數內提升),只提升變量聲明,不提升變量初始化和使用。且,函數提升優先級高於變量提升。
function bar() {console.log('bar')
var foo = 11;
function foo() {}
return foo;
foo = 10;
}
alert(typeof bar());
var name = 'World!';
(function () {
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
5.var x = 4,
obj = {
x: 3,
bar: function() {
var x = 2;
setTimeout(function() {
var x = 1;
alert(this.x);
}, 1000);
}
};
obj.bar();
6.// 當函數被當做構造函數運行時,返回時有3種情況。1:沒有設定返回值,默認返回this
// 2.指定返回值爲基本數據類型,則仍然返回this 3.指定返回值爲對象,則按照指定值返回
x = 1;
function bar() {
this.x = 2;
return {name: 24};
}
var foo = new bar();
console.log(foo)
console.log(foo.x)
7.// 後面的bar忽略
var foo = function bar() {};
console.log(typeof foo);
8.var arr = [];
arr[0] = 'a';
arr[1] = 'b';
arr.foo = 'c';
console.log(arr.length);
9.function foo(a) {
arguments[0] = 2;
console.log(a);
}
foo(1);
10.function foo(){}
delete foo.length;
console.log(typeof foo.length);