Skip to content

Latest commit

 

History

History
95 lines (91 loc) · 2.15 KB

【note】STh About JavaScript:.md

File metadata and controls

95 lines (91 loc) · 2.15 KB

【note】STh About JavaScript:

1.

这里的难点在于setTimeout(func, [delay, [arg1, [arg2, ...]]])的理解

var a= 0;
function one(){
  for(var i = 0;i<10;i++){
   setTimeout(function(){
    a+=i;
   },0)
  }
}
function two(){
  alert(a); //a=100
}
one();
setTimeout(function(){
    two();
  },0);//此处setTimeout去掉的话,alert出来的a值为0

2.

function b(a) {
    console.log(a);
    var a = 1;
    console.log(a);
    // function a() {}
    console.log(a);
}
b(7);

3.

var o = {
    foo: a,
    length: 5,
    bar: function() {
        arguments[0]();
    }
}
function a() {
    //a.length为Function形参的个数
    console.log(this.length);
}
o.foo();
o.bar(a, 0, 2);

##4. 涉及语言细节: 1)变量声明提升 2)函数表达式的执行(拆分两行,具体见下文注释) 3)JS运算符优先级 4)构造函数返回值

1.JS中构造函数若没有指定返回值,则像其他语言一样返回实例化对象 2.若有返回值,if 返回值 == 引用类型: 返回该引用类型 else if 返回值为非引用类型: 与无返回值处理相同,返回实例化对象。

注意: 第三问中,执行Foo()后覆盖了原来的window.getName,从而影响了第四问的结果; 第五问中.的优先级高于new,相当于new (Foo.getName)() 同理,第六文中括号优先于new,相当于(new Foo()).getName()(new Foo())返回实例化对象,然后再调用实例化对象的getName(),也就是prototype中的getName()

function Foo() {
    getName = function() {
        alert(1);
    }
    return this;
}
Foo.getName = function() {
    alert(2);
}
Foo.prototype.getName = function() {
    alert(3);
}
/**解析顺序为 
    var getName 编译时提升变量声明到开头
    getName = function() {...} 后执行
 **/
var getName = function() {
    alert(4);
} 
function getName() {
    alert(5);
}
//run
Foo.getName();    //2
getName();        //4
Foo().getName();  //1 
getName();        //1
new Foo.getName();//2
new Foo().getName();//3
new new Foo().getName();//3