JavaScript函数_函数作用域

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 类型 判断类型不能检查基本类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值