读大叔深入理解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.闭包

你可能感兴趣的:(JavaScript)