zoukankan      html  css  js  c++  java
  • 作用域闭包、预解释和this关键字综合题目

    var number = 2;
    var obj = {number : 5,
        fn1 : ( function() {		 
    	this.number *= 2;
    	number=number*2;
     	var number=3;
    		return function() {
    			this.number *= 2;
    			number*=3;
    			alert(number);
    		}
        } )()
    };
    var fn1 = obj.fn1;
    alert(number);     
    fn1();    
    obj.fn1();   
    alert(window.number);  
    alert(obj.number); 
    

    【解析】
    1.fn1本身后面就有(),所以var fn1 = obj.fn1;时他已经被执行,但是里面的return function并没有被执行

    2.alert(number);输出全局的number,本来是2,经过var fn1 = obj.fn1;后,相当于执行了

    this.number *= 2;
    number=number*2;
    var number=3;

    这三句话

    注意:任何一个直接执行的匿名方法,他的this指向window

    所以this.number *= 2;使得全局变量变成4,即输出4

    而number=number*2;他是去看作用域块里的number,var number=3;作用域声明在先,但是没有赋值,所以number=number*2;这句话其实没用

    3.执行到fn1();就是执行fn1里面的return function,也就是这三句话

    this.number *= 2;
    number*=3;
    alert(number);

    这时候依然是个匿名方法,所以this.number *= 2;使得全局变量变为8,number*=3;去找作用域块里的number,外层定义number为3,所以alert(number);就是9,如果是alert(this.number);则指向全局变量,即输出8

    4.obj.fn1();,依然执行fn1里面的return function,也就是这三句话

    this.number *= 2;

    number*=3;

    alert(number);

    但这时this指向obj,this.number *= 2;使得obj里的number变为10,number*=3;还是去找作用域块,由于上面变为9,所以这里就是27,alert(number);输出的是作用域块的number,即27,如果是alert(this.number);则指向obj的number,即输出10

    5.alert(window.number);经过上面几轮,全局变量变为8(即执行obj.fn1();对全局变量无影响)

    6.alert(obj.number);只有这句话obj.fn1();,改变了obj.number,所以输出10

    (function(){
         var a=10;
        fn();
        function fn(){
            var a=a+10;
            console.log(a);
             return a;
        }
        console.log(a);
        console.log(fn()+10);
    })();
    

    fn函数里的a先被声明但是没有赋值,然后进行运算,他不会去找函数外面的同名变量,因为他已经在里面被声明了。一个不是数字的和数字进行运算,输出NaN

    console.log(fn()+10);这句话要输出两个值:console.log(fn());和console.log(fn()+10);
    结果:
    NaN
    10
    NaN
    NaN
    如果题目改成
    (function(){
        var a=10;
        fn();
        function fn(){
            a=a+10;
            console.log(a);
            return a;
        }
        console.log(a);
        console.log(fn()+10);
    })();
    

    结果:

    20

    20

    30

    40

  • 相关阅读:
    Redis 分区
    利用phpexcel把excel导入数据库和数据库导出excel实现
    Phpcms V9网站从本地上传到服务器需要修改的地方
    PHPcms怎么调用二级栏目
    phpcms调用一级栏目和二级栏目
    [v9] 列表页 调用 正文内容 或 自定义 字段(moreinfo的调用方法)
    phpcms v9最常用的22个调用代码
    phpcms_v9 多图字段 内容页,首页,分页自定义字段调用
    JS常用语句
    phpcms v9中调用栏目及调用多个子栏目中的文章列表
  • 原文地址:https://www.cnblogs.com/zhangwenkan/p/4248106.html
Copyright © 2011-2022 走看看