`
hain
  • 浏览: 449105 次
  • 来自: ...
社区版块
存档分类
最新评论

JavaScript学习

 
阅读更多
一直都有在页面用javascript作为脚本语言,但未从未深入了解,每当需要用到什么功能的时候再查找相关事例,最近看了js框架感觉之前的了解明显不够。

一、原始值和对象
javascript中的原始值(undefined,null,数字、字符串和布尔值)和对象(包括数组和函数)有着根本的区别。原始值不可更改:任何方法都无法改变一个原始值。原始值的比较是值的比较。对象的属性值可以改变,且对象的比较不是属性值的比较。对象的比较是引用的比较,当且仅当它们引用的是同一个对象时比较才相等(对象可称为引用类型)。
  数值、字符串和布尔值原始值有对应的包装对象,当对原始值调用属性时会自动调用其包装对象准换为临时对象,并被用来处理属性的引用。一旦属性引用结束则销毁临时对象。而null和undefined无对应的包装对象,故不能引用其属性。
       如:var test='test'  //创建一个字符串
                    test.len=10; //设置对象属性,会创建一个临时字符串对象并设置属性随即销毁
               var t=   test.len //  创建一个新的临时字符串对象,尝试读取len属性但不存在返回undefined

二、类型转换
    javascript中的取值非常灵活,将根据需要自动进行类型转换。
    "=="等于运算在判断值相当时会自动转换成同类型再比较。
    "==="恒等运算在判断相等时不做类型转换
    注意一个值转换为另一个值并不意味着两个值相等,比如在期望布尔值的时候undefined会被转换为false。但并不表明undefined==false。"=="运算符从不试图将操作数转换为布尔值。但是1==true 和0==false  都为真。变量如果不为-0,+0,null,undefined,false,都会被处理为true。new Boolean(false)是一个对象会转换为ture。
     +和==应用的是对象到原始值的转换。
   日期类型是javascript中唯一预先定义的类型,定义了有意义的向字符串和数值类型的转换。对于所有非日期类型对象向原始值的转换,基本上是对象到数值的转换(首先调用valueOf())

三、作用域
      javascript使用了函数作用域:变量在声明它们的函数体及这个函数体嵌套的任意函数体内都是有定义的。且函数里声明的所有变量(不涉及赋值)都被提前至函数体的顶部,即声明提前,在代码运行之前的预编译进行。函数体内的局部变量会覆盖同名的全局变量。
       除函数作用域外的变量均为全局变量。当声明一个全局变量时,实际上是定义了全局对象的一个属性。当使用var声明一个变量时,创建的这个属性是不可配置的,也就是这个变量无法通过delete运算符删除。如果没有使用严格模式并给一个未声明的变量赋值的话,会自动创建一个全局变量,以这种方式创建的变量是全局对象的正常的可配置属性并可删除。[测试都可删除]
   一般来说以下几种情形拥有全局作用域:
     1)最外层函数和在最外层函数外面定义的变量拥有全局作用域
     2)所有末定义直接赋值的变量自动声明为拥有全局作用域
     3)所有全局对象(如:window对象)的属性拥有全局作用域

四、作用域链
      在JavaScript中,函数也是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
 
    执行函数时会创建一个称为“运行期上下文(execution context)”的内部对象,运行期上下文定义了函数执行时的环境。每个运行期上下文都有自己的作用域链,用于标识符解析,当运行期上下文被创建时,而它的作用域链初始化为当前运行函数的[[Scope]]所包含的对象。
   什么是执行环境呢?在javascript里面执行环境分为两类,一类是全局环境,一类是局部环境,整个页面里被共享的方法和属性就是在全局环境,相对于全局环境,函数{}号里的执行环境就是局部环境,执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为,每个执行环境都定义了一个与之相关的变量对象,环境中定义的所有变量和函数都保存在这个对象里,虽然我们自己编写的代码无法访问这个对象,但解析器在处理数据时候后台会使用到它。
    全局执行环境另一种说法是最外围的一个执行环境,在web浏览器的范围中(actionscript也是施行了ECMAScript标准,它的全局范围就和javascript的全局范围不同),全局执行环境被认为是window对象,因此全局变量和函数都是作为window对象的方法和属性来创建的,全局执行环境知道应用程序退出比如关闭网页或浏览器才会被销毁。而局部环境则是以函数对象作为关联对象。
     每个执行环境都有一个与之关联的变量对象(variable object, VO),执行环境中定义的所有变量和函数都会保存在这个对象中,解析器在处理数据的时候就会访问这个内部对象。
   全局执行环境是最外层的一个执行环境,在web浏览器中全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和放大创建的。每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境会被推入一个函数栈中,而在函数执行完毕后执行环境出栈并被销毁,保存在其中的所有变量和函数定义随之销毁,控制权返回到之前的执行环境中,全局的执行环境在应用程序退出(浏览器关闭)才会被销毁。
    当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain,不简称sc)来保证对执行环境有权访问的变量和函数的有序访问。作用域第一个对象始终是当前执行代码所在环境的变量对象(VO)
function a(x,y){
            var b=x+y;
            return b;
        }

在函数a创建的时候它的作用域链填入全局对象,全局对象中有所有全局变量

尽量使用局部变量,就带来一个十分重要的提高程序性能的用法:我们在函数内部使用全局变量可以说是一种跨作用域操作,如果某个跨作用域的值在函数的内部被使用到一次以上,那么我们就把它存储到局部变量里。

五、原型
      每一个对象都关联一个原型对象并继承其属性(null除外),没有原型的对象不多,Object.prototype就是其中之一。通过对象直接量创建的对象都具有同一个原型对象,并可通过Object.prototype获得对原型对象的引用。
      
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics