关于延时执行和变量提升

问题:怎么理解setTimeout的延时执行
描述:我想通过执行改变函数原型的构造属性查看new方法的具体使用,但是在触发changAs()之后,我发现位于changAs()语句之前的console.log(new As());触发的显示中构造函数已经被改变

clipboard.png

答案:

1. setTimeout无效的原因是因为语法错误
2. 控制台打印错误的结果是因为在chrome的环境下,console.log()函数虽然不是异步函数,但是会产生堵塞i/o,所以打印的结果和异步产生的结果是一样的,要注意的是,这并不代表在chrome下console.log()是异步函数,只是会产生这样的结果,而且是可避免的

然后我打算利用setTimeout触发延时执行产生异步,但是无效

渴望的回答:

  1. setTimeout在这里为什么会无效
  2. 希望能解释为什么会出现后触发先执行但结果依然被改变

十分感谢

代码:

function As() {
    c = function(){
        console.log("摇曳露营no.1");
    };
    a = 1 ;
    a = 2;
    return this;
};
As.prototype.As = "小不点no.1";
As.prototype.c = function(){
    console.log("小南极no.1");
};
console.log(As);
console.log(typeof(As));
var s1 = As;
console.log(s1);        //仅仅是方法的字变量给赋值了
console.log(As());    //返回window对象,如果去掉return就会产生undefined,因为没有返回值
console.log(As.prototype);
As().c();        //摇曳露营no.1        //既然没有返回值,underined.c()肯定找不到
console.log(As().a);        //私有属性 ,如果a定义在函数内部,即私有属性,window里是找不到的
console.log(new As());    //这里触发
new As().c();    //小南极no.1
new new As().c();    //小南极no.1
console.log(new As().As);    //小不点no.1
function changeAs(){
console.log("改变");
As.prototype.constructor = function(){
    this.d = function(){
        console.log("京紫no.1");
    }
    return this;
}}
setTimeout(changeAs(), 2000);
console.log(new As());
阅读 2k
2 个回答

先看setTimeout的函数签名...

setTimeout({String|Function} code,{number} [delay]);

setTimeout 第一个参数是function

setTimeout(changeAs(), 2000);

楼主的代码传入的是changeAs的返回值... 这里应该是 void

可以尝试改成这样

setTimeout(changeAs, 2000);

或者

setTimeout(function(){
  changeAs();
}, 2000);

问题2:

https://developer.mozilla.org...

返回创建实例对象的 Object 构造函数的引用。注意,此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。对原始类型来说,如1,true和"test",该值只可读。

constructor 在其他语言是构造函数,相当于 new 的时候会触发的一个hook, 但是在js中....并不会起到这种作用.. 应该直接AS = function(){} 去改变构造函数

建议楼主多补充点基础知识

var obj={};
console.log(obj);
obj.test='test';

你运行上面的代码看看结果

推荐问题
宣传栏