首頁 > web前端 > js教程 > 主體

js中Function 類型有哪些

一个新手
發布: 2017-10-20 11:04:43
原創
1291 人瀏覽過

最有意思的函數

  有意思的根源在于- 函数也是对象,同样有拥有属性和方法。 
  由于函数是是对象,那么函数名也就相当于指向函数对象的指针
 通常函数是由"函数声明"创建:
登入後複製
1 function(sum1,sum2){
2   reutnr sum1 + sum2;  
3 }
登入後複製
  也可以使用"函数表达式"创建:
登入後複製
1  var sum = function(sum1,sum2){
2    return sum1+sum2;
3 };
登入後複製
  还有一种方式使用"构造函数"创建: (但不推荐)
登入後複製
<span style="font-family: "Microsoft YaHei"; font-size: 16px">  //这种方式,会导致两次解析代码,第一次解析常规的代码,第二次解析传入构造函数中的字符串。</span><br/><span style="font-family: "Microsoft YaHei"; font-size: 16px">1 <span style="color: #0000ff">var</span> sum = <span style="color: #0000ff">new</span> Function("sum1","sum2","return sum1+sum2")</span>
登入後複製
  "函数声明"与"函数表达式"的区别在于:
登入後複製
  1. 函數表達式沒有函數名稱

##函數表達式需要分號結尾

###擁有多個函數名稱的函數######
  上面提到,函数是对象,而函数名仅仅是执行函数对象的指针。
  这代表着,通过将函数名赋值给其他变量,其他变量则也可以通过自身调用该函数。  注意: 访问函数对象指针时,则需要带小括号,如上面函数访问 sum 函数的指针
           则需要将 sum 赋值给一个变量,该变量便可拥有指向同等函数的指针。    
登入後複製
eg: var sum1 = sum; // sum(); sum1(); 执行的结果相同
登入後複製
强调: 使用 "函数名+()",代表着调用该函数, 不添加 "()",则代表访问该"指向该函数对象的指针"
        将函数名设置为 null ,则可以使其指向的函数断绝联系。
登入後複製
eg: sum = null; // sum(); 则会报错,提示sum不是一个函数, null代表着空对象指针
登入後複製
######函數沒有重載######
  相同的函数名,后者会替换前者(函数声明或者函数表达式都是如此,这里以函数声明为例子)
登入後複製
eg: function sum(sum1){ return sum1+ 100 }    
function sum(sum2){ return sum2+ 200 }
    sum(100);   // 300;
登入後複製
######函數宣告與函數表達式的差異######
  js解析器在对于这两者是由区别的。
  函数声明的函数,在开始执行代码之前,就会通过函数声明提升的过程,读取并将函数声明添加到执行环境中。
  即使函数在调用函数后面,也不会影响函数求值。
  而函数表达式则不会,解析器必须执行到当前代码块才会被初始化并执行。如果调用在前,则
登入後複製
######作為值的函數######
  在JS中,函数名本身就是变量。所以函数也可以作为值来使用。
  也就是说,不仅仅可以作为一个函数的参数,也可以作为一个函数的返回值。
  而sort() 方法只能根据 tostring() 的值来排序
登入後複製
eg: var data = [{name:&#39;A&#39;,age:2},{name:&#39;B&#39;,age:1}]
  // 创建指定属性的函数
   function setAttr(name){
        return function(o1,o2){
            var v1 = o1[name];
            var v2 = o2[name];
        
            if(v1 < v2) { return -1;
          }
            else if(v1 > v2) { return 1;  }
            else             { return 0;  }
        }
    }
    //使用sort()方法调用
    data.sort(setAttr(&#39;age&#39;));   // [{name,:&#39;B&#39;,age:&#39;1&#39;},{name:&#39;A&#39;,age:&#39;2&#39;}]
    data.sort(setAttr(&#39;name&#39;));  //  [{name:&#39;A&#39;,age:&#39;2&#39;},{name,:&#39;B&#39;,age:&#39;1&#39;}]
登入後複製
### ###函數的屬性######
  每个函数都包含两个属性: length, prototype;  length : 表示函数接收的参数个数。
登入後複製
1 eg: funciont sum(test){}   //sum.lenght  == 1;
登入後複製
<span style="font-family: "Microsoft YaHei"; font-size: 16px"><span style="background-color: #ffffff"><strong>   prototype:  </strong></span>在JS中,该属性是保存所有实例方法的真正所在。
  在创建自定义引用类型以及实现继承时,该属性是非常重要的。<strong><span style="background-color: #ffffff">   prototype: </span></strong>属性是不可枚举的,因此不能使用for in发现。<br/>  通过构造函数的 <strong><span style="background-color: #ffffff">prototype </span></strong>属性,创建的方法或者属性,都会被它的实例对象所继承,从而实现继承机制。<br/></span>
登入後複製
######函數的方法######
  每个函数都包含两个非继承而来的方法: apply() 与 call();
  两者区别在于,第二个参数的不同。
  该方法强大在于,可以扩充函数赖于运行的作用域。  apply(): 第一参数是在其中运行函数的作用域,另一个是参数数组。  call()   : 第一参数是在其中运行函数的作用域,其他参数直接传递给函数,
              也就是除第一个参数,其他都是逐个列举出来。
 使用场景: 两者结果没有任何区别,而具体使用哪个,则取决于你传入的参数使用哪个方法方便。
                如果传入参数是一个数组则使用 apply 更合适一点,否则 call() 更合适一点。
登入後複製

以上是js中Function 類型有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!