zoukankan      html  css  js  c++  java
  • Javascript 作用域与this的用法

    1 现象

    Js代码: 
    1. <SCRIPT LANGUAGE="JavaScript">  
    2.     var list=[1,2,3];  
    3.     function show(){  
    4.         document.write("list :"+list+"</br>");  
    5.         if(typeof list=="undefined"){  
    6.             var list = [1];  
    7.             // alert("Function show:"+list.length);  
    8.             document.write("Function show:"+list.length+"</br>");  
    9.             document.write("this list:"+this.list.length+"</br>");  
    10.             document.write(this.list===window.list);//  true  
    11.         }  
    12.     }  
    13.     show();  
    14. </SCRIPT>  

    运行结果:

     list :undefined
     Function show:1
     this list:3
     true

    2分析

    首先Global对象的中创建list数组,这个list在浏览器里面的宿主环境也就是window对象。 从运行结果我们看到函数show() 里面的list对象添加到了函数环境,而不能说是覆盖,因为window.list依然没变,全局环境的Global有自己的list对象,函数只是他的属性或者方法,函数里的list对象与Global的对象不同。调用show() 是在全局环境调用即是window环境,所以show()方法里面的this指向的是window.

    3 脚本引擎的活动

    在请求调用一个函数的时候,脚本引擎会先出场,然后再去调用脚本引擎的代码。脚本引擎到底做了什么事情呢。运行结果我们看到 list :undefined 而经过前面分析  list 不是window的对象。先这一段代码

    Js代码:  
    1. <SCRIPT LANGUAGE="JavaScript">  
    2.     function show(){  
    3.         document.write("list :"+list+"</br>");  
    4.         if(true){  
    5.             var list = [1];  
    6.         }  
    7.         document.write("list:"+list.length+"</br>");  
    8.     }  
    9.     show();  
    10. </SCRIPT>  

     结果:

    list :undefined
    list:1

    这里看到list.length 并没有声明在一块,却可以访问,这是Javascript引擎做的事情。引擎首先给函数环境添加list变量。 指向undefined。

    引擎处理的代码是:
    Js代码:  
    1. <SCRIPT LANGUAGE="JavaScript">  
    2.     function show(){  
    3.         var list;  
    4.         document.write("list :"+list+"</br>");  
    5.         if(true){  
    6.             list = [1];  
    7.         }  
    8.         document.write("list:"+list.length+"</br>");  
    9.     }  
    10.     show();  
    11. </SCRIPT>  

     

    脚本引擎总是把声明放在函数的最前面。最后才是真正的执行函数。

    过程:请求执行函数-->脚本引擎做一些事情-->执行函数 。

    Javascript是有作用域的,但是与Java的作用域不同,Java的作用域都是在一个代码块里面起作用,Javascript只不过不是块作用域。

    Javascript不是块作用域类型:
    Js代码: 
    1. <SCRIPT LANGUAGE="JavaScript">  
    2.     function show(){  
    3.         document.write("list :"+list+"</br>");  
    4.         if(true){  
    5.             if (true) {  
    6.                 if (true) {  
    7.                     var list = [1];  
    8.                 };  
    9.             };  
    10.         }  
    11.         document.write("list:"+list.length+"</br>");  
    12.     }  
    13.     show();  
    14. </SCRIPT>  

     3 this

      想知道this是什么,只需要知道谁在调用它即可,谁调用它,他就是谁。对于原型链也是一样的,只不过它的prototype指针指向一层一层的向上找(搜索机制)。

    原文参考自站长网http://www.software8.co/

  • 相关阅读:
    vue脚手架搭建项目
    springmvc上传下载文件
    vue双向绑定(模型变化,视图变化,反之亦然)
    android中广告轮播图总结
    studio插件
    系统图片uri的问题
    android
    mysql 外键(FOREIGN KEY)使用介绍
    不用加减乘除来做加法的题目
    Comparable接口实现和使用方法介绍
  • 原文地址:https://www.cnblogs.com/wwwroot/p/2855152.html
Copyright © 2011-2022 走看看