Function在JavaScript中函数是一种对象,函数名是指向对象的引用。可以用一下方式调用它
var fun = new Function(“参数”,”返回值”,”函数体”);
因此如果出现下面这种情况,就已很好理解了。第二个函数重写了第一个函数,可以理解为第二个对象覆盖了第一个对象。函数名只是引用,doAdd变量改变了引用的地址。
var doAdd = new Function(“iNum”, “alert(iNum + 20)”);
var doAdd = new Function(“iNum”, “alert(iNum + 10)”);
可以使用 ‘函数名.length’ 返回参数的数量:
//函数将输出1
function show(num){
alert(show.length);
};
arguments
函数的一个内置属性。arguments类似一个数组,访问该函数的实参,实参的数目不一定等于形参
function show(x,y,z){
alert(arguments.length); //返回 4
alert(arguments[2]); //返回 c
alert(show.length); //返回 3
arguments[0] = 'f';
alert(x); //返回 f
};
show('a','b','c','d');
arguments.callee
返回此arguments对象所在的当前函数引用
比如,递归算法时函数本身,arguments.callee表示函数本身
//计算num的阶乘
function sum(num){
if(num<=1) {
return 1;
}else{
return num*arguments.callee(num-1);
}
}
alert(sum(4));
函数的toString() 和 ValueOf()返回函数的源代码
call apply
改变函数的作用域
二者的异同:
apply() : 接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
call() : 第一个参数与apply()方法相同,但传递给函数的参数必须列举出来。
<script>
var name = "tom";
function show(){
alert("hello "+this.name); //this必须加上,否则会成为全局变量
}
var obj = {
name:"jerry"
}
show.call(window);
show.call(obj);
</script>
结果: hello tom —> hello Jerry
this
JavaScript中的this与c++中的不同,this可以改变,对于函数fun(),如果用obj.fun()调用他,那么函数fun中得this就是obj对象,但是call(),apply()可以改变函数中的this。例如:
fun.call(window);
fun.call(this); // 此时的this就是window
这时fun函数中的this变成了了window
作用域
函数A体内包含其他函数B,只有在函数A的作用域内才能调用B
<script>
function A(){
B();
function B(){
alert("This is function B");
}
}
A();
</script>
没有块级作用域
if(){} 没有封闭作用域的功能
if(true){
var temp = "sss";
}
alert(temp);
//结果是sss
for(;;){} i和内部的变量都是全局的
for(var i=0;i<10;i++){
var temps = "for";
}
alert("i:"+i+"temps:"+temps);
//结果是i:10 temps:for
在函数中变量加上var是局部变量,不加var就是全局变量。函数使用变量时,先从本地的作用域中搜索,如果没有搜索到就到上一层作用域中搜素。所以,访问局部变量要比全局变量快
PS:
1,基本类型不能加属性(只有Object是引用)
2,基本类型保存在栈内存中,引用类型保存在堆内存中,基本类型的赋值时复制了整个内容,而引用类型的赋值只是地址的复制
3,所有函数的参数都是按值传递的,对象传的值是地址因此外部的对象也会变化
4,instanceof 类型 判断类型不能检查基本类型