5、函數調用

来源:http://www.cnblogs.com/-hongchen/archive/2017/04/07/6676159.html
-Advertisement-
Play Games

JS函數調用Javascript 函數有 4 種調用方式。每種方式的不同在於this的初始化。this關鍵字 一般而言,在Javascript中,this指向函數執行時的當前對象。但是this是保留關鍵字,並不能被修改。 調用函數,函數中的代碼在函數被調用後執行。 以上函數不屬於任何對象,但是在JS ...


JS函數調用
Javascript 函數有 4 種調用方式。每種方式的不同在於this的初始化。
this關鍵字
一般而言,在Javascript中,this指向函數執行時的當前對象。但是this是保留關鍵字,並不能被修改。

調用函數,函數中的代碼在函數被調用後執行。

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8"/>
 5         <title></title>
 6         <script>
 7             function myFunction(a, b) {
 8                 return a * b;
 9             }
10             myFunction(10, 2); //myFunction(10, 2) 返回20
11         </script>
12     </head>
13 </html>

以上函數不屬於任何對象,但是在JS中它始終預設是全局對象。

在HTML中預設的全局對象是HTML頁面本身,所以函數是屬於HTML頁面的。

在瀏覽器中的頁面對象是瀏覽器視窗。以上函數會自動變為window對象的函數。

所以myFunction()與window.myFunction()是一樣的效果。

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8"/>
 5         <title></title>
 6         <script>
 7             function myFunction(a, b) {
 8                 return a * b;
 9             }
10             window.myFunction(10, 2); //返回20
11         </script>
12     </head>
13 </html>

這個是調用JS函數常用的方法,但不是良好的編程習慣。

全局變數、方法和函數容易造成命名衝突的bug。

全局對象:

當函數沒有被自身的對象調用時,this的值就會變成全局對象。在瀏覽器中全局對象是window對象。所以以下代碼this值返回window對象。

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8"/>
 5         <title></title>
 6         <script>
 7             function myFunction() {
 8                 return this;
 9             }
10             window.myFunction(); //返回windo對象
11         </script>
12     </head>
13 </html>

函數作為全局對象調用,會使this的值變成全局對象。使用window對象作為一個變數容易造成程式崩潰。

函數作為方法進行調用:

在JS中可以將函數定義為對象的方法。

以下一段代碼創建了一個對象myObject,對象有兩個屬性firstName和lastName,以及一個方法fullName:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title></title>
        <script>
            function myObject() {
                firstName:'前端';
                lastName:'技術';
                fullName:function() {
                    return this.firstName + " " + this.lastName;
                }
            }
            myObjec.fullName(); //返回前端 技術
        </script>
    </head>
</html>

fullName方法是一個函數。函數屬於對象。myObject是函數的所有者。

this對象擁有javascript代碼。以上代碼中this的值為myObject對象。

以下代碼修改了fullName方法並返回this值:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title></title>
        <script>
            function myObject() {
                firstName:'前端';
                lastName:'技術';
                fullName:function() {
                    return this;
                }
            }
            myObjec.fullName(); //返回[object object](所有者對象)
        </script>
    </head>
</html>

函數作為對象方法調用,會使得 this 的值成為對象本身。

使用構造函數調用函數:

如果函數調用前使用了new關鍵字,則調用了構造函數。

看起來就像創建了新的函數,但實際上JS函數是重新創建的對象:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8"/>
 5         <title></title>
 6         <script>
 7             function myFunction(arg1, arg2) {
 8                                               this.firstName = arg1;
 9                                               this.lastName = arg2;
10                                             }
11  
12                                             // This creates a new object
13                                             var x = new myFunction("前端","技術");
14                                             x.firstName;               // 返回 "前端"
15         </script>
16     </head>
17 </html>        

構造函數的調用會創建一個新的對象。新對象會繼承構造函數的屬性和方法。

構造函數中this關鍵字沒有任何的值。

this的值在函數調用時實例化對象的時候創建。

作為函數方法調用函數:

在JS中,函數是對象。JS函數有它的屬性和方法。

call()和apply()是預定義的函數方法。兩個方法可用於調用函數,兩個方法的第一個參數必須是對象本身。

call方法:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8"/>
 5         <title></title>
 6         <script>
 7             function myFunction(a, b) {
 8                                           return a * b;
 9                                     }
10             myFunction.call(myObject, 10, 2);   // 返回 20
11         </script>
12     </head>
13 </html>

apply方法:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title></title>
        <script>
            function myFunction(a, b) {
                                          return a * b;
                                    }
            myArray = [10,2];
            myFunction.apply(myObject, myArray);  // 返回 20
        </script>
    </head>
</html>

兩個方法都使用了對象本身作為第一個參數。 兩者的區別在於第二個參數: apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。
在 JS嚴格模式(strict mode)下, 在調用函數時第一個參數會成為 this 的值, 即使該參數不是一個對象。
在 JS 非嚴格模式(non-strict mode)下, 如果第一個參數的值是 null 或 undefined, 它將使用全局對象替代。
通過 call() 或 apply() 方法可以設置 this 的值, 且作為已存在對象的新方法調用。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝 直接下載CDN 引用 <script src="/path/to/vue.js"></script> <script src="/path/to/vuex.js"></script> npm npm install vuex --save 在一個模塊化的打包系統中,您必須顯式地通過Vue.us ...
  • 1、安裝前準備 安裝 webpack 之前,需要安裝 node,這時最新的是 6,npm 是 4。如果有老的 node 項目在跑建議安裝下 nvm。 2、建議安裝在局部,即在項目下的 node_modules 里 比如在 webpack_demo 目錄下新建了一個 w1 項目,先用 npm init ...
  • 本人的博客寫了grunt的小教程,從零開始,一步一步的通過例子講解,希望喜歡的同學給我的github上加顆星,謝謝! github地址: https://github.com/manlili/grunt_learn grunt入門:點擊我學習 grunt配置:點擊我學習 grunt創建任務:點擊我學 ...
  • 翻譯自angular.io上的關於4.0.0版本發佈的文章,內容主要是介紹了4.0.0版本下的改進以及接下來還會有的其他更新,4.0.0其實已經出來好多天了,截止目前都已經到了4.0.1版本了,這也是前兩日筆者一時興起拿想ng2寫個自己的新網站時安裝angular時無意發現幾個模板與組件聲明時的錯誤 ...
  • CSS3 旋轉的八卦圖 ...
  • 嗯,前面講了javascript的一些基本的符號和語句,咱們繼續來學習學習流程式控制制語句~~ ps:講在前面,通過學習別人的博客,我發現一個問題,我對字體顏色的使用很少(基本不用),可能因為眼睛的問題,我對顏色確實不太敏感,甚至對讓人眼花繚亂的顏色有一定程度的厭惡,一篇顏色單調的文章,著實不能讓人一眼 ...
  • 今天分享一個比較實用的技巧,在實際項目中我們會經常遇到表單的input標簽多選和單選的問題,但是往往由於標簽自身的樣式和我們項目的風格很不搭調,就不能實現了,今天就來告訴大家怎麼去實現吧。 第一種:利用偽類:(開源中國) 需要註意的是:在頁面佈局中,還是有input【type=checkbox】的: ...
  • 現在利用之前我們學過的JavaScript知識,實現選項卡切換的效果。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...