Q1: this
var foo = '123';
function print() {
this.foo = '234';
console.log(foo);
};
print();
var foo = '123';
function print() {
//AO -> this{} -> window.foo{}
//GO -> {foo:undefined} 预编译
//GO -> {window.foo:123} 执行第一行
//GO -> {window.foo:234} 执行第二行
this.foo = '234';
console.log(foo);
};
print(); //234
Q2: this
var foo = '123';
function print() {
this.foo = '234';
console.log(foo);
console.log(this.foo);
};
new print();
var foo = '123';
function print() {
//AO -> 只有一个this -> {} (this不再指代,自身创建一个对象this{foo = '234'})
//GO -> {foo : undefined}
//GO -> {foo :123}
this.foo = '234';
console.log(foo);
console.log(this.foo);
};
new print(); //123
Q3: 执行
function print() {
bar.a = 'a';
Object.prototype.b = 'b';
return function inner() {
console.log(bar.a);
console.log(bar.b);
}
}
print()(); //说明第一次执行完返回一个函数继续被执行
//第一次执行进行赋值,返回函数inner
//第二次执行函数inner,输出结果
Q4: 逗号运算符
var num = (1, 2); //逗号运算符,分别执行,保留后面的值
console.log(num);
var f = (function h() {return '1'}, function g(){return 2})();
console.log(1 + typeof f, f);
Q5: 函数表达式
var x = 1;
if(function f(){}){//把函数放到括号里变成表达式 执行完undefined
x += typeof f;
}
console.log(x);
//1undefined
Q6:类数组
var obj = {
2: 'a',
3: 'b',
length: 2,
push: Array.prototype.push,
splice: Array.prototype.splice
};
obj.push('c');
obj.push('d');