资讯专栏INFORMATION COLUMN

js函数的一些难点

韩冰 / 1826人阅读

摘要:今天又把函数部分复习了一下,把一些难点归纳下,为了让书越看越薄,还是决定记下来。不过,匿名函数的执行环境具有全局性,因此其对象通常指向当然,在通过或改变函数执行环境的情况下,就会指向其他对象。匿名函数可以用来模仿块级作用域并避免这个问题。

今天又把javascript函数部分复习了一下,把一些难点归纳下,为了让书越看越薄,还是决定记下来。

1. 创建函数的2种方式:函数声明和函数表达式:

二者的区别:函数声明提升。函数声明后面不能跟圆括号,但函数表达式后面可以跟圆括号。要将函数声明转化为函数表达式,只需在给函数声明加一对圆括号即可。(function(){})();
函数声明:重要特征:函数声明提升,在执行代码前先读取函数声明,所以可以把函数声明放在调用它的语句后面。

sayHi();
function sayHi(){
     alert("hi");
}   //不会报错

函数表达式在使用前必须先赋值。否则会报错。

sayHi();
Var sayHi=function{
     alert("hi");
}   //会报错

2.递归:arguments.callee是一个指向正在执行的函数的指针。

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

但是在严格模式下,不能通过脚本访问arguments.callee。可通过下面的方法。

var factorial=(function f(num){
     if(num<=1){
          return 1;
     }else{
          return num * f(num-1);
     }
});

3.this对象:

this对象是在运行时基于函数的执行环境绑定的:在全局函数中this等于window,而在函数被当作某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window(当然,在通过call()或apply()改变函数执行环境的情况下,this就会指向其他对象)。

var name="the window";
var obj={
     name:"My object",
     getNameFun:function(){
          return function(){
               return this.name;
          }
     }
}
alert(obj.getNameFun()());  //the window

4.多次声明同一个变量:

function outputNumber(){
     for(var i=0;i<10;i++){
          console.log(i);  //1 2 3 4 5 6 7 8 9
     }
     var i;
     console.log(i);  //10
}

javascript从来不会告诉你是否多次声明了同一个变量:遇到上述情况,它只会对后续声明视而不见(不过,它会执行后续声明中的变量初始化)。匿名函数可以用来模仿块级作用域并避免这个问题。

5.闭包与变量:
由于作用域链的机制,闭包只能取得包含函数中任何变量的最后一个值。是因为闭包所保存的是整个变量对象,而不是某个特殊的变量。

function createFunction(){
     var result=new Array();
     for(var i=0;i<10;i++){
          result[i]=function(){
               return i;
          }
     }
     alert(result[2]()); //10
     return result;
}

result是一个函数数组,此时每个函数都引用着保存变量i的同一个变量对象,所以在每个函数内部i的值都是10. 但是可以通过让函数立即执行,来符合我们的预期。

function createFunction(){
     var result=new Array();
     for(var i=0;i<10;i++){
          result[i]=function(num){
               return num;
          }(i)
     }
     alert(result);//0,1,2,3,4,5,6,7,8,9
     return result;
}

由于函数参数是按值传递的,所以会将变量i的当前值复制给参数num,这样,result数组中的每个函数都有自己num变量的一个副本,因此就可以返回各自不同的数值了。

6.返回一个函数:

function createCompareFunction(pro){
     return function(obj1,obj2){
          var va1=obj1[pro];
          var va2=obj2[pro];
          if(va1va2){
               return 1;
          }else{
               return 0;
          }
     };
     }
     var compare=createCompareFunction("name");//创建函数
     alert(compare({name:"wsz"},{name:"hh"}));//调用函数

7.一道面试题:

     var add=function(x){
          var sum=1;
          var tmp=function(x){
               sum=sum+x;
               return tmp;
          }

          tmp.toString=function(){
               return sum;
          }
          return tmp;
     }
alert(add(1)(2)(3));

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86363.html

相关文章

  • 你需要知道面试中10个JavaScript概念

    摘要:自我学习目前有成千上万的年轻人在学习和开发,希望获得一份工作。知道的绑定规则。知道和原型属性是什么以及它们的作用。高阶函数了解函数是中的一级对象,这意味着什么知道从另一个函数返回函数是完全合法的。了解闭包和高阶函数允许我们使用的情况。 翻译原文出处:10 JavaScript concepts you need to know for interviews 之前不是闹得沸沸扬扬的大漠穷...

    YacaToy 评论0 收藏0
  • JavasScript重难点知识

    摘要:忍者级别的函数操作对于什么是匿名函数,这里就不做过多介绍了。我们需要知道的是,对于而言,匿名函数是一个很重要且具有逻辑性的特性。通常,匿名函数的使用情况是创建一个供以后使用的函数。 JS 中的递归 递归, 递归基础, 斐波那契数列, 使用递归方式深拷贝, 自定义事件添加 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果...

    forsigner 评论0 收藏0
  • JS难点之hoist

    摘要:但是变量只有其声明被提前在作用域的最开始处,赋值结果仍然还在原来位置。 这篇博文是之前在CSDN写的,现在移至sf。 有过C或者Java类编程经验的同学,对于先声明后使用的规则很熟悉,如果使用未声明的变量或者函数,编译时程序会报错!但是,JavaScript却是一个‘大奇葩’,可以在变量或者函数声明之前使用,现在根据我的理解在做一下说明。 首先说明JS的hoist分为变量hoist和函...

    biaoxiaoduan 评论0 收藏0
  • JS笔记

    摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。异步编程入门的全称是前端经典面试题从输入到页面加载发生了什么这是一篇开发的科普类文章,涉及到优化等多个方面。 TypeScript 入门教程 从 JavaScript 程序员的角度总结思考,循序渐进的理解 TypeScript。 网络基础知识之 HTTP 协议 详细介绍 HTT...

    rottengeek 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<