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.闭包