js函数其实不在意你传递多少个参数,解析器永远不会有怨言。参数在内部是用一个arguments数组来表示的。
function howManyArgs(){
alert(arguments.length);
}
howManyArgs(1, 2);
howManyArgs();
howManyArgs(1);
function setName(obj) {
obj.name = 'a';
obj = new Object();
obj.name = "b";
}
var person = new Object();
setName(person);
console.log(person);
console.log(obj);
所有函数的参数都是按值传递的。即使传入的是一个对象,也只能通过指针地址去修改这个对象的属性,而不能重写这个对象。
可以把函数的参数想象成局部变量。
上面的例子,当在函数内部重写obj时,这个变量引用的就是一个新的对象了。 由于没有用var关键字,obj也变成了一个全局变量。
每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。
var a = 'a';
function b() {
var b='b';
function c() {
var c='c';
}
}
window.color='red';
var o = {color:"blue"};
function sayColor(){
alert(this.color);
}
var objSayColor = sayColor.bind(o);
objSayColor(); // blue
function factorial(){
if(num<=1){
return 1;
} else {
return num * arguments.callee(num-1);
}
}
function cntNum(cnt) {
(function () {
for(var i=0; i<cnt; i++) {
console.log(i);
}
})()
console.log(i);
}
任何在函数中定义的变量,都可以看成是私有变量。因为无法在函数外部访问,包括参数、局部变量、在函数内部定义的其他函数。
function Person(name) {
this.getName = function () {
console.log(name);
}
this.setName = function (val) {
name = val;
}
}
var person1 = new Person("a");
var person2 = new Person("b");
person2.setName('c');
person1.getName();
person2.getName();
因为函数的参数是一个局部变量(私有变量)。每一次调用函数或者new,局部变量name都会在内存中生成一次。
可以想象一下,连续调用多次函数,他们之间的参数肯定是独立的,不能共用的。
一般而言,当函数执行完后,这个临时生成的参数name变量就会被销毁,但是对于new而言却不会
当构造函数的作用域赋给新对象时,不仅仅this被赋予了,生成的新对象仍在引用着那些局部变量,所以不会name被立刻销毁,这里其实有些类似闭包了。
(function () {
var name = '';
Person = function (val) {
name = val;
};
Person.prototype.getName = function () {
console.log(name);
};
Person.prototype.setName = function (val) {
name = val;
};
})();
var person1 = new Person("a");
var person2 = new Person("b");
person2.setName("c");
person1.getName();
person2.getName();
所有实例间共享的变量,比如上例中的 name。一个实例变化,所有实例都一起变化。