对象
创建对象几种方式
//字面量
var customer = {};
//构造函数
var obj = new Object();
构造函数
构造函数和一般函数并没什么大的区别。一般函数名大写,对象自身属性用this.attr表示。也可以通过原型动态添加属性。
function Person(name, age){
this.name = name;
this.age = age;
}
//通过原型添加属性
Person.prototype.address = 'hz';
Person.prototype.work = function (someting){
//dosometing
};
Person.prototype.car = {};
函数
函数也是一种对象,可以用Function构造函数直接创建:
var func = new Function('arg1', 'arg2', 'return arg1 + arg2');
在Function中除了最后一个是函数体外,其他都是传入的参数。
函数有自己的属性length,表示参数的个数。
函数里内置变量arguments表示传入的参数,类似数组。但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。
函数里内置this表示当前上下文。
函数声明和表达式
//以下是声明。可以在声明前提前调用函数。
function add(){
}
//以下是表达式。只用在表达式定义后才能调用函数
var add = function(){
//...
}
函数名作为值
既然函数是一种对象,那么函数名其实就是一个对象的引用,它可以作为值进行传递和赋值。可以用来实现回调和闭包。
//回调func
function call(args, func){
return func(args);
}
//从一个函数返回另外一个函数
function closure(args){
return function(args){
//...
};
}
立即执行函数
一般形式:
(function (arg){
//...
})(arg);
顾名思义,立即执行函数就是定义后马上执行的函数。在立即执行的函数里面是独立的命名空间,可以隔离全局命名空间,避免污染全局命名空间。
闭包
闭包是指可以访问其它函数(一般指外部函数)作用域的函数。
作用域
JavaScript没有私有成员的说法,任何成员都是共有的。不过函数中的变量被认为是私有的,函数外部无法访问。
没有块级作用域
Javascript不像C和Java里面有块级作用域。
for(var i = 0; i < 10; i++){
}//i有可能污染全局命名空间。
// i没有被销毁,仍旧有效
var i;//即使重新声明后,仍旧视而不见
console.log(i); //这里仍旧输出10
设置私有作用域
用立即执行函数设置私有作用域;
从而限定
(function privateScope(){
var i = 10;
})();
//i已经被销毁了
console.log(i);//这里访问会报错:i is not defined