js的Function(1)

1、函数实际上是对象

      每个函数都是Function类型的一个实例,与其他引用类型一样具有属性和方法的。函数名实际上是一个指向函数对象的指针。

2、没有重载

3、函数声明提前

var name = 'World!';

(function () {

    if (typeof name === 'undefined') {

        var name = 'Jack';

        console.log('Goodbye ' + name);

    } else {

        console.log('Hello ' + name);

    }

})();

//输出为  Goodbye Jack

解释:var 声明的作用域在整个 function 中, 但并没有初始化。简单说,浏览器的JavaScript引擎首先会扫描所有的变量声明,并把变量声明上升到作用域的顶部,但是又不会改变变量赋值的位置。因此在实际的代码运行中,由于内层函数域的重新初始化干扰,外层域初始化'name'是假象,这就导致了在'name'未没初始化赋值之前,就判断其值,肯定是'undefined'

3、作为值的函数

script type="text/javascript">
        function callSomeFunction(someFunction, someArgument){
            return someFunction(someArgument);
        }

        function add10(num){
            return num + 10;
        }
        
        var result1 = callSomeFunction(add10, 10);
        alert(result1);   //20
        
        function getGreeting(name){
            return "Hello, " + name;
        }
        
        var result2 = callSomeFunction(getGreeting, "Nicholas");
        alert(result2);   //Hello, Nicholas

    </script>

4、函数内部属性

在函数的内部,有两个特殊的对象:arguments和this。arguments包含着传入函数的所有参数,这个对象有一个callee属性,该属性是一个指针,指向拥有这个arguments对象的函数。

function factorial(num){
            if (num <= 1) {
                return 1;
            } else {
                return num * arguments.callee(num-1)
            }
        }

        var trueFactorial = factorial;
        
        factorial = function(){
            return 0;
        };
        
        alert(trueFactorial(5));   //120
        alert(factorial(5));       //0

//阶乘函数

5、函数属性和方法

每个函数都包含两个属性:length和prototype。

length表示函数希望接收的命名参数个数,函数定义了一个参数,length的值为1。。。。

prototype


每个函数都包含两个非继承而来的方法:apply()和call()

这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内的this对象的值。他们最强大的功能是扩充函数懒以运行的作用域。

如:<script type="text/javascript">
        
        window.color = "red";
        var o = { color: "blue" };
        
        function sayColor(){
            alert(this.color);
        }
        
        sayColor();            //red
        
        sayColor.call(this);   //red
        sayColor.call(window); //red
        sayColor.call(o);      //blue

    </script>

apply()方法接收两个参数:一个是在其中的运行函数的作用域,另一个是参数数组

  <script type="text/javascript">
        
        function sum(num1, num2){
            return num1 + num2;
        }
        
        function callSum1(num1, num2){
            return sum.apply(this, arguments);
        }
        
        function callSum2(num1, num2){
            return sum.apply(this, [num1, num2]);
        }
        
        alert(callSum1(10,10));   //20
        alert(callSum2(10,10));   //20

    </script>

call()方法,在使用call()方法时,传递给函数的参数必须是逐个列举出来

 <script type="text/javascript">
        
        function sum(num1, num2){
            return num1 + num2;
        }
        
        function callSum(num1, num2){
            return sum.call(this, num1, num2);
        }
        
        alert(callSum(10,10));   //20

    </script>

看了《高级程序设计第三版》做的一些总结。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值