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的