zoukankan      html  css  js  c++  java
  • 读大叔深入理解javascript(1)

    1.delete只能删除属性,对于var声明的变量是不能的

    注意:

    通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。

    无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。

    var a = (function(){return this;}()); //return globa object
    a == window   //return true
    
    m = 1;    //这个属于隐式全局变量,其实这中全局变量是window这个全局变量的一个属性
    a.m  //return 1
    delete m;
    a.m //return undefined

     特例:eval("var t=1"),这种方式的声明,根据上下文,表示当前作用域的变量,可以被delete删除;不推荐使用eval

    2.单var的应用(用逗号分割)

    var a = 1,
           b = [],
           str = 'daxian',
           obj = {};

    3.javascript的预解析var散布的问题(Hoisting: A Problem with Scattered vars)

    当你使用了一个变量,然后不久在函数中又重新声明的话,就可能产生逻辑错误。对于JavaScript,只 要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。看下面这个例子:

    x = 'globa'      //隐式全局变量
    function func1(){
          console.log(x)   
    }
    func1();        //return globa;
    
    function func(){
           console.log(x)      //return undefined
           var x = 'local';
           console.log(x)     //return local;
    }
    func2()      

    插入获取DOM对象:

    document.getElementById
    document.getElementsByName
    document.getElementsByTagName
    document.getElementsByClassName
    
    //在DOM标准之前还在用的
    
    document.images      //获取页面上的所有图片
    document.links           //获取页面上的所有链接
    document.forms         //页面上的所有表单
    document.forms[0].element   //表单中的某个表单元素

    注意:

    for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”。

    从技术上将,你可以使用for-in循环数组(因为JavaScript中数组也是对象),但这是不推荐的。因为如果数组对象已被自定义的功能增强,就可能发生逻辑错误。另外,在for-in中,属性列表的顺序(序列)是不能保证的。所以最好数组使用正常的for循环,对象使用for-in循环

    4.hasOwnProperty过滤原型方法

    var man = {name:'jzliu',age:21,birth:'2012-08-01'};
    if(typeof Object.prototype.clone === 'undefined'){
            Object.prototype.clone = function(){};
    }
    
    for(var i in man){conosle.log(i+":"+man[i])}
    return 
    name:jzliu
    age:21
    birth:2012-08-01
    clone:function (){}
    
    for(var i in man){
          if(man.hasOwnProperty(i)){   //过滤掉原型链的数据信息
                 conosle.log(i+":"+man[i])
          }
    }
    return 
    name:jzliu
    age:21
    birth:2012-08-01
    
    另一种g过滤方式
    for(var i in man){
          if(Object.prototype.hasOwnProperty.call(man,i)){
                 conosle.log(i+":"+man[i])
          }
    }
    
    return 
    name:jzliu
    age:21
    birth:2012-08-01

    5.setTimeout(function(){Fun(a,b,c);},1000)

    6.return {'name':'xxxxx'}

    7.函数声明跟函数表达式的区别(声明会被先解析)

    函数声明:function funName(param,...){}

    函数表达式:function funName[可选](){}

    所以,可以看出,如果不声明函数名称,它肯定是表达式,可如果声明了函数名称的话,如何判断是函数声明还是函数表达式呢?ECMAScript是通过上下文来区分的,如果function foo(){}是作为赋值表达式的一部分的话,那它就是一个函数表达式,如果function foo(){}被包含在一个函数体内,或者位于程序的最顶部的话,那它就是一个函数声明。

    function foo(){} // 声明,因为它是程序的一部分
      var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分
    
      new function bar(){}; // 表达式,因为它是new表达式
    
      (function(){
        function bar(){} // 声明,因为它是函数体的一部分
      })();

    还有一种函数表达式不太常见,就是被括号括住的(function foo(){}),他是表达式的原因是因为括号 ()是一个分组操作符,它的内部只能包含表达式,我们来看几个例子:

    function foo(){} // 函数声明
    (function foo(){}); // 函数表达式:包含在分组操作符内

    表达式和声明存在着十分微妙的差别,首先,函数声明会在任何表达式被解析和求值之前先被解析和求值,即使你的声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值

    if (true) {
        function foo(){ return 1; }
      }
      else {
        function foo(){ return 2; }
      }
      foo(); // 1
      // 注:其它客户端会将foo解析成函数声明 
      // 因此,第二个foo会覆盖第一个,结果返回2,而不是1

    8.私有方法和变量 用var声明

    9.(function(){xxxx}())

    10.原型链实现继承

    11.闭包

    你对人生迷茫吗? 那就背起行囊,起步远行吧
  • 相关阅读:
    TCP Data Flow and Window Management(3)
    全渠道java b2b b2c o2o平台
    springmvc mybatis shiro ios android构建cms系统
    电子商务系统+java+web+完整项目+包含源码和数据库Java实用源码
    大型互联网 b2b b2c o2o 电子商务微服务云平台
    mybatis电子商务平台b2b2c
    spring mvc mybatis shiro构建cms系统ios android
    spring mvc+mybatis 构建 cms + 实现UC浏览器文章功能
    b2b b2c o2o电子商务微服务云平台
    java分布式电子商务云平台b2b b2c o2o需要准备哪些技术??
  • 原文地址:https://www.cnblogs.com/daxian2012/p/2646842.html
Copyright © 2011-2022 走看看