/* 核心內容 1.文法 2.類型 3.語句 4.關鍵字 5.保留字 6.對象 7.函數 一、ecmascript5的關鍵字 break do instanceof typeof case else new var catch finally return void continue for switch while debugger function this with default if throw delete in try 二、ecmascript5的保留字 abstract enum int short boolean export interface static char extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public 三、變數 -鬆散變數(可以存放任何類型資料) -全域變數 -局部變數 -變數範圍 */ //全域變數 function print(str) { document.writeln(str + '<hr/>'); } var whole_var = 'felayman'; //全域變數 function getVar() { var part_var = 'hello,csdn'; print(whole_var); //在函數內擷取全域變數 } //print(part_var);//訪問局部變數,這裡訪問不到 getVar(); //訪問局部變數 function get_var() { message = 'felay'; } //print(message);//在這裡直接這樣使用,會出現錯誤 /* 這樣是訪問不到message變數的。按照標準來將的化 按照常理來說,一般會出現undefined字樣,但是很 可惜,這裡不會有任何內容,因為js引擎並沒有在全 局範圍中尋找到message的定義,因為此時的函數 在位調用之前,其屬性(資料)是對外屏蔽的,而只有 在函數在被調用後,我們才能去訪問函數內部的資料 這就跟OOP語言中,只有一個類被執行個體化後,我們才能 去訪問該對象的屬性一樣。,因此上述在直接列印message 的時候,是無法擷取到任何內容的,要能夠擷取到message的 化,我們就必須將函數載入到記憶體中,這樣全域對象window才 能將message儲存到它的範圍中。因此,下面的方式我們 是可以擷取到message的值的,在標準的JSLint的檢查下 會出現如下提示: Missing 'use strict' statement */ get_var(); print(message); function window_var() { window.name = 'felayman'; } window_var(); print(name); /* 資料類型 1.undefined 2.null 3.boolean 4.number 5.string 6.object 7.function */ //1.undefined 就是定義一個變數但是沒有未其初始化 var undefined_var ;//該變數屬於未定義變數 if(typeof undefined_var=="undefine"){ print(undefined_var); } print('==============undefined=================='); //說明,我們聲明了一個變數,但是沒有初始化,就屬於undefined,在看看下面 print(undefined == undefined);//true print(undefined =='undefined');//false print('undefined'==undefined);//false print('undefined'=='undefined');//true print('undefined'==='undefined');//true print(typeof undefined);//undefined print(typeof 'undefined');//string //2.boolean print('================boolean========================='); print(true);//true print(true==true);//true print(true===true);//true print(true=='true');//false print(1=='1');//true print(1==='1');//true print(typeof true);//bolean print('=================string============================'); print('felayman');//felayman print(typeof 'felayman');//string print('=================null============================'); print(null);//null print(typeof null);//object 說明null本身是對象 print('=================number============================'); print(100);//100 print(typeof 100);//number print(100+'hello');//100hello print('=================object==============================='); var obj1={}; print(obj1);//object var obj2 = new Object; print(obj2);//object var obj3 = new Object(); print(obj3);//object print(typeof obj1);//object print('=================function==============================='); var obj4 = function(){}; print(obj4);//function var obj5 = new Function(); print(obj5);//function print(typeof obj5);//function /* 上述是對ecmascript的資料類型的簡單描述,下面是對object和function的深入瞭解 */ print('=======================深入對象===================================='); /* 其實ecmascript中是不怎麼區分函數和對象的,因為無論對象還是函數,都是對資料的封裝,說白了, 都是資料的一種載體。,只是一般的函數所作出的邏輯處理要不對象要多和複雜。 一般情況下,我們在ecmascript中建立對象有兩個方法,一種是通過構造器來進行建立,一種是字面量 的方式來建立,由於JSON的流行,我們更喜歡和推薦使用字面量的方式來建立一個對象,如下: */ //構造器來建立對象 var user = new Object();//後面的括弧可有可無//這裡並沒有為user對象添加屬性 print(typeof user );//測試user確實是物件類型 //字面量來建立對象 var person = {};//這裡並沒有為person對象添加屬性 print(typeof person);//測試person確實是物件類型 /* 有人說還有第三章方法,如下 */ function Student(){ }; print(typeof Student); /* 經過測試,並非object,而是function,也因此,在這裡說明一下,ecmascript雖然使用了函數和對象, 但是不同其他語言的函數,在ecmascript中的函數,就類似於其他OOP語言中的類,屬於模板,二對象則 屬於函數執行個體,因此,對於我們的對象,跟普通的函數是一樣的,不存在使用new關鍵字,因此只存在一個執行個體 而函數則可以有多個執行個體,後面會仔細說道,因此目前在ecmascript中只存在上述的兩種方法來建立對象 既然是對象,肯定有成員屬性和成員方法,但是我們建立出來的對象並麼有顯示的屬性和方法,但是在對象被 建立後,確實有它的屬性和方法的。當我們使用了new Object()方法建立的對象,都會有下面的屬性和方法的 */ //1.Constructor 這是一個成員函數(建構函式),儲存當前被建立的對象的引用 print(typeof user);//object print(typeof user.constructor());//object print(typeof person);//object print(typeof person.constructor());//object print(user == user.constructor()); print(person == person.constructor()); /* 這裡我們可以看出一些端倪,即user和user.constructor()並不是持有同一個引用。我們使用的user屬於記憶體中的 一個執行個體,但是這裡的user.constructor()屬於對user對象的引用。,下面我們為我們建立的屬性設定屬性和方法 */ user.name = 'felayman1'; user.age = 22; user.getInfo = function(){ return ('姓名:'+this.name+',年齡'+this.age); } print(user.getInfo()); //或者 user.getInfoParam = function(name,age){ return ('姓名:'+name+',年齡'+age); } print(user.getInfoParam('felay',22)); //再或者 user.get = function(name,age){ return ('姓名:'+this.name+',年齡'+this.age);//此時的參數是無效的 } print(user.get('felayman2',23)); /* 上述的例子中可以看出,我們雖然可以為對象設定屬性和方法,但是這樣的化,代碼顯示的並不是很優雅,不符合封裝效果,在這裡我們使用 了this關鍵字,通過上述例子知道,this指向的是當前的對象(其實可以切換內容物件的使用call和apply),因此我們不推薦使用這樣 的寫法,反而是使用字面量的寫更加符合物件導向的形式,如下 */ var object = { 'name':'felayman', 'age':22, 'job':'student', 'getinfo' :function(){ return ('name:'+this.name+',age:'+this.age+'job:'+this.job); }};print(object.getinfo());/* 上述的寫法是不是看起來更加物件導向,封裝性也特別好,因此,我們強力推薦使用這種寫法.至於對象的其他複雜的情況,比如: 範圍、原型鏈、閉包等複雜的情況,我會在學習對象和函數的詳細關係後進行解釋。,下面我先對於函數的理解,建立一個函數 也有三種方法*/ //1.函式宣告的方式 function func1(){}; print(typeof func1);//function //2.運算式函數 var func2 = function(){};//function print(typeof func2);//function var func3 = new Function(); print(typeof func3);//function /* 函數定義或者聲明後,我們必須進行顯示的調用才會去執行函數內部的代碼,當然我們定義的三個函數都沒有寫具體的代碼,下面就將 三個函數進行改 */ function func_name1(name,age){ return '姓名:'+name+',年齡:'+age; } var func_name2 = function (name,age,job){ return '姓名:'+name+',年齡'+age+',職業:'+job; } var func_name3 = new Function("name","age","job","return '姓名:'+name+',年齡'+age+',職業:'+job;"); print(func_name1('felayman',22)); print(func_name2('felayman',22,'學生')); print(func_name3('felayman1',23,'學生')); /* 上述的三種方法就是函數的三種使用方法,其中我們一般在初學的時候推薦前兩種寫法,但是當我們對scmascript瞭解比較深入的時候 我們強烈推薦學習第三種方式,對於後面的學習很有協助.對於函數,它的參數非常重要,因為雖然在scmascript中不存在函數的重載, 但是卻有可變參數一說,如下: */ function addAll(num1,num2,num3){ print(arguments.length); }; addAll();//0 addAll(100);//1 addAll(100,200);//2 /* 因此,我們可以通過arguments這個參數對象來定製我們所需要的參數 */