1. 程式人生 > >JavaScript程式設計隨筆

JavaScript程式設計隨筆

雖然說用JS很多年了,但是卻一直停留在膚淺的階段,對JS的機制原理依然是一知半解,例如:閉包,雖然能說出一二,卻不能說出三四,確實慚愧。最近惡補一番,並將比較與大家分享,希望對大家有些幫助。

閉包

老概念,在JS程式設計中我們可能在不經意間就用到了它,只是我們不知道而已。首先呢,閉包並不是一個函式或者型別,而是一直語言機制,如果硬要做個類比的話,我覺得它應該屬於“繼承”這型別的語言機制。

在JS裡面,函式外部是不能直接呼叫函式內部的變數,如果我們非要呼叫它們的話,那你就需要閉包,舉個例子:

如果我們想在outerFunc外部呼叫color變數,那我們就得使用閉包機制,呼叫方式如下

function outerFunc()
{
    var color='red';
    function innerFunc(c)
   {
        color=c;
        alert(color);
   }
    return innerFunc;
}

var tmp=outerFunc();
tmp('green'); //green


This

如果我們呼叫的物件分別存在多個定義域裡面,例如:全域性或區域性,並且我們在用它的時候還加上了This關鍵字,那大家就要小心了,這時候我們就需要分辨我們呼叫的物件到底是全域性的呢,還是區域性的呢?

第一次呼叫返回的結果是一個包含this.name的函式體,但是我們執行它的定義域確實在全域性,所有它會返回’the window'。但是第二次呼叫呢,它的定義域是區域性,所以它返回'my object',第三次呼叫返回的是閉包,所以它的結果當然是它的區域性變數值‘my object2'。

 var name = "The Window";
        var object = {
            name: "My Object",
            getNameFunc: function () {
                return function () {
                    return this.name;
                };
            }
        };

        var object2 = {
            name: "My Object2",
            age: 22,
            gender:'Femal',
            getNameFunc: function () {
                var name = this.name;
                return function () {
                    return name;
                };
            }
        };

        alert(object.getNameFunc()());
        object.show = object.getNameFunc();
        alert(object.show());
        alert(object2.getNameFunc()());


Call 和 Apply

這兩關鍵字的使用和This有很大的關係,它們能模擬物件的執行環節,對上面的例子來說,如果我們對第一呼叫做如下修改,那麼它返回的結果將是’My Object‘。

        alert(object.getNameFunc().call(object));
        alert(object.getNameFunc().apply(object));
首先呢,object.getNameFunc()返回的是一個函式體,其次呢,我們通過call和apply在object的定義域內執行返回的函式體,所以返回的值也就不一樣了。

Prototype

prototype是JS物件的一個內部原型機制,我們可以給它新增屬性或方法,這些內容都能被它對應的物件所識別。prototype在JS面向物件的程式設計中用的比較多,基本上都用它來實現物件的繼承機制,具體看下面例子。

 function person()
        {
            this.sex = 'male';
            this.age = 21;
            
        }
        person.prototype.introduce = function () {
            console.log('im a ' + this.sex + ' and im ' + this.age + ' years old');
        }

        function Jim()
        {
            this.name = 'Jim';
        }

        Jim.prototype = new person();

        var people = new Jim();
        people.introduce();

在這裡呢,我們成功的將person的所有屬性賦值給Jim.prototype了,當然這些東西對Jim物件是完全可見的,大家看,是不是通過這種方式很實現JS的單項繼承呢?

相關推薦

JavaScript程式設計隨筆

雖然說用JS很多年了,但是卻一直停留在膚淺的階段,對JS的機制原理依然是一知半解,例如:閉包,雖然能說出一二,卻不能說出三四,確實慚愧。最近惡補一番,並將比較與大家分享,希望對大家有些幫助。閉包老概念,

第三方JavaScript程式設計.epub

【下載地址】 第三方JavaScript應用程式是自包含的應用元件,通常都是小指令碼或外掛,能夠為Web站點增加功能。它們往往是由獨立的組織或個人提供的,程式碼和檔案都是來自於遠端的Web地址。 《第三方JavaScript程式設計》由兩位第三方應用程式開發領域的專家編寫完成,通過豐富

JavaScript程式設計用法——JavaScript執行環境

檔案版本說明 版本 釋出日期 修訂章節 作者 0.1 2018.05.01 撰寫草稿 鍾鑫 0.2 2018.05.05 新增js變數定義 鍾鑫 0.3 2018.05.05 新增js編譯環境 鍾鑫 0.4 2018.05.11 新

JavaScript程式設計趨勢:用map和filter替換forEach

當你需要拷貝一個數組的全部或者部分到一個新陣列的時候,優先使用map和filter而不是forEach。 諮詢工作的好處之一是我可以看到無數的專案。這些專案在規模、使用的程式語言和開發人員的能力方面差別很大。雖然有很多我覺得應該廢棄的模式,但是在JavaScr

JavaScript程式設計用法——JavaScript語法

判斷符號=== JavaScript的判斷符號“=”既比較型別也比較數值,然而“”只比較值,在不同型別的比較中“==”會將數值轉換成同一型別進行比較。 原始碼 function js_var_cmp(){ console.log("cmp 1 == '1'

html+css+javascript程式設計實戰專案及心得

<!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8">     <title>實踐題 - 選項卡</title>     <style type="tex

YUI事件:自定義事件,以及這幾天對javascript程式設計的認識

程式碼 <script type="text/javascript"> YUI().use('event-custom','node', function(Y) { //應用event-custom模組 function Connector(url) {

javascript程式設計容易出現的11個錯誤

javascript是比較容易學的。但是,對於這門語言需要有一些值得注意的地方。本文將指出javascript程式設計中可能犯過的10個錯誤 錯誤1-使用全域性變數 如果你剛開始javascript程式設計,可能會覺得全域性變數很好用。事實上,剛開始javascri

javascript程式設計起步(第四課)

轉自javascript.com.cn(放在這裡主要是方便我自己的學習,如果不允許的話,請通知我,我將自行刪除) 今天的主要任務就是:1:For迴圈;2:資料型別;3:既for in(現在還沒有講陣列和物件,先了解一下)。 資料型別的轉換:如果運算的資料型別不是一樣的話,j

JAVA併發程式設計隨筆【一】PriorityBlockingQueue優先順序佇列

一、優先順序佇列PriorityBlockingQueue必須是實現Comparable介面,佇列通過這個介面的compare方法確定物件的priority。當前和其他物件比較,如果compare方法返回負數,那麼在佇列裡面的優先順序就比較搞     比較規則:當前物件

Java併發程式設計隨筆【九】中被丟棄的執行緒組ThreadGroup

執行緒組的初衷是作為一種隔離的機制,當然是出於安全的考慮。但是它們從來沒有真正的履行這個承諾,它們的安全價值已經差到根本不在Java安全模型的標準工作中被提及的地步。 既然執行緒組並沒有提供所提及的任何安全功能,那麼它們到底提供了什麼功能呢?不多,它們允許你同

初識javascript程式設計模式

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>程式設計模式</title> <

javascript程式設計起步(第五課)

轉自javascript.com.cn(放在這裡主要是方便我自己的學習,如果不允許的話,請通知我,我將自行刪除) 今天的課程就輕鬆一下,學習點能見到效果的。主要內容就是基於滑鼠的事件,有如下幾種:1.mouseover(滑鼠移至)2.mouseout(滑鼠移出)3.mous

深入理解JavaScript程式設計中的同步與非同步機制

JavaScript的優勢之一是其如何處理非同步程式碼。非同步程式碼會被放入一個事件佇列,等到所有其他程式碼執行後才進行,而不會阻塞執行緒。然而,對於初學者來說,書寫非同步程式碼可能會比較困難。而在這篇文章裡,我將會消除你可能會有的任何困惑。理解非同步程式碼 JavaS

Ajax/JavaScript學習隨筆:java script Object Notation(JSON)

======================================================注:本文原始碼點此下載 ======================================================簡單地說,json 可以將 j

每天一練:JavaScript 程式設計題&MySQL 程式設計題&Java 程式設計題25

1.JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎?答:Java通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在Java中,每個異常都是一個物件,它

牛客網javascript程式設計的輸入輸出

寫在前面 轉載地址http://blog.csdn.net/baidu_38742725/article/details/77717853?locationNum=5&fps=1 作為一名程式設計師,你找工作的時候一定要刷牛客網的各種演算法、資料結構和程式設計題,那麼,問題來了,牛客網的線上程式設計

Meteor學習筆記之三——《JavaScript程式設計全解》讀書筆記

Micheal力薦的JS教程,寫的還是挺不錯的,記錄一些有用的東西吧 比較時的注意事項 前面提到多次的一點是,在比較時注意比較的是物件還是值,舉個例子 var sobj1 = new String('abc'); var sobj2 = new S

javascript程式設計思維與選擇結構

程式設計思維 程式是啥? 生活中的程式: (1)宿舍報修:填寫保修單→上報宿舍管理員→聯絡物業→找維修師傅上門維修→反饋。 (2)銀行開戶:客戶填寫開戶申請單→提交證件資料→稽核資料真實性(1是否是本

Javascript程式設計環境搭建

        最近搞JavaScript的程式設計環境,使用了webstorm(js的獨立開發工具)、Aptana(eclipse外掛)、Notepad++等,最後還是決定用Notepad++,最主要的原因是Notepad++查詢方便,而其它工具由於無法向eclipse的