1. 程式人生 > >javascript高階程式設計筆記(六)

javascript高階程式設計筆記(六)

day 06


作為值的函式
從一個函式返回另一個函式,是一種極為有用的技術。可用於陣列物件進行排序。如下函式:
function createComparisonFunction(propertyName)
{
	return function(object1,object2){
	     var value1 = object1[propertyName];
	     var value2 = object2[propertyName];
	     if(value1<value2){
		return -1;
		
	     }else if(value1>value2)
	     {
		return 1;
		}else{
		   return 0;
		}
	};
}

var data = [{name:"nick",age:28},{name:"zack",age:25}];
data.sort(createComparisonFunction("name"));
alert(data[0].name);//nick,以名字name排序n<z
data.sort(createComparisonFunction("age"));
alert(data[0].name);//zack,以年齡age排序 25<28

函式內部屬性

在函式內部,有兩個特殊的物件:arguments和this。arguments是一個類陣列物件,包含著傳入函式中的所有引數。該物件還有個名叫callee的屬性,該屬性是一個指標,指向擁有這個arguments物件的函式。如下非常經典的階乘函式:

function factorial(num)
{
	if(num<=1)
	{
	   return 1;
	}else{
	   return num*factorial(num-1);
 	}
}
     定義階乘一般要用到遞迴演算法,如上所示。在函式有名字並且不改變的情況下,這樣定義沒有問題。但這樣就將函式的執行與函式名factorial緊緊的聯絡到了一起,為了消除這種緊密的耦合現象,可以採用arguments.callee。
function factorial(num){
	if(num<=1)
	{
	   return 1;
	}else{
	   return num*arguments.callee(num-1);
 	}
}


function factorial(num)
{
	if(num<=1)
	{
	   return 1;
	}else{
	   return num*arguments.callee(num-1);
 	}
}
var truefactorial = factorial;


factorial = function(){
   return 0;
}
var x = truefactorial(3);//6而非0
     函式內部的另一個特殊物件就是this.this引用的是函資料以執行的環境物件,當在網頁的全域性作用域中呼叫函式時,this物件引用的是window。如下所示:
window.color = "red";
var o = {color:"blue"};
function printColor(){
   alert(this.color);
}
printColor;//red
o.printColor = printColor;
o.printColor();//blue
     以上函式中sayColor()是在全域性作用域中定義的,引用了this物件,由於在呼叫之前並不確定this的值,因此this可能會在執行過程中引用不同的物件,當在全域性中被呼叫時,this引用的是全域性物件window,即this.color 會轉換成window.color,於是返回“red”;當把這個函式賦給物件o並呼叫o.printColor()時,this引用的是物件o,因此對his.color求值會轉換成對o.color求值,結果就返回“blue”。

注:函式名僅僅只是一個包含指標的變數而已,即使在不同的執行環境中,全域性的printColor與o.printColor指向的仍然是同一個函式。

函式屬性和方法
      ECMAScript中函式就是物件,因此也就有屬性和方法。每個函式都包含兩個屬性:length和prototype,其中,length表示函式希望接收的命名引數的個數,如下:
function sayName(name){
	alert(name);
}
function sum(num1,num2){
	return num1 + num2;
}
function sayHi(){
	alert("hi");
}
alert(sayName.length);//1
alert(sum.length);//2
alert(sayHi.length);//0
prototype屬性非常重要,以後詳講。
     每個函式都包含兩個非繼承而來的方法:apply()和call()。這兩個方法的用途都是在特定的作用域中呼叫函式。apply()方法接收兩個引數:一個是在其中執行函式的作用域,另一個是引數陣列。第二個引數可以是Array的例項,也可以是arguments物件。如下:
function sum(num1,num2){
	return num1 +num2;
}
function callSum1(num1,num2){
	return sum.apply(this,arguments);//傳入arguments物件
}


function callSum2(num1,num2){
	return sum.apply(this,[num1,num2]);//傳入陣列
}
alert(callSum1(10,10));//20
alert(callSum2(10,10));//20
       嚴格模式下,未指定環境變數而呼叫函式,則this值不會轉型為window,除非明確把函式新增到某個物件或者呼叫apply()或者call(),否則this 值將是undefined。

      call()方法與apply()方法的作用相同,區別在於接收引數的方式不同。call(),第一個引數是this值,其餘的引數都直接傳遞給函式,即,使用call()方法時,傳遞給函式的引數必須逐個列舉出來。apply()和call()真正的用處在於能夠擴充函式賴以執行的作用域,如下:

window.color = "red";
var o = {color:"blue"};
function sayColor(){
	alert(this.color);
}
sayColor();
sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue

相關推薦

javascript高階程式設計筆記

day 06 作為值的函式 從一個函式返回另一個函式,是一種極為有用的技術。可用於陣列物件進行排序。如下函式:function createComparisonFunction(propertyName) { return function(object1,object

PHP、MySQL和JavaScript學習手冊筆記

index 查詢 user 邏輯 creat date text select HERE 第八章此系列的文章都是圍繞《PHP、MySQL與JavaScript學習手冊》開展的,記錄下我自學的歷程。 mysql入門 1.進入mysql管理 mysql -u username

網路程式設計 筆記 多程序伺服器

程序 - 程序(Process):“佔用記憶體空間的正在執行的程式” - 程序ID :作業系統給程序分配的id,其值大於2,1要分配給作業系統啟動後的首個程序 -linux檢視程序的命令:ps au ;引數a和u列出所有程序的詳細資訊 通過fo

廖雪峰的python筆記 --高階特性

目錄 1.切片: 2.迭代:通過for迴圈來遍歷這個list或tuple 3.列表生成式:List Comprehensions--用來建立list的生成式。 4.生成器: 5.迭代器: 程式碼越簡單越好! 1.切片: 取一個list或tuple的部分元素是

Javascript筆記之程式結構與流程控制語句

一、程式結構簡介 1、幾個基本概念 程式結構分為順序結構、分支結構、迴圈結構,通常伴隨著這幾種程式結構存在的還有流程控制語句; 在ECMA-262規定來一組流程控制語句,語句定義了ECMAScript中的主要語法,語法通常由一個或多個關鍵字來完成給定的任務,例如

javascript資料結構與演算法筆記:雙向連結串列

javascript資料結構與演算法筆記(六):雙向連結串列 一:簡介 二:ES6版DoublyLinkedList類 一:簡介 雙向連結串列和普通連結串列的區別在於,在連結串列中,一個節點只有鏈向下一個節點的連結,而

JAVA程式設計思想學習筆記複用類

複用類 組合語法 組合語法就是在類中用其他類的物件作為本類的成員變數。 編譯器不會為每一個引用都建立預設物件,想要初始化引用,可以在下列位置進行: 在定義物件的地方 在類的構造器中 在使用物件之前,惰性初始化 使用例項初始化 繼承語法 關鍵

Java併發程式設計的藝術筆記——ConcurentHashMap的原理與實現

一.執行緒不安全的HashMap 多執行緒環境下,使用HashMap進行put操作會引起死迴圈(jdk1.7 Entry連結串列形成環形資料結構),導致CPU利用率接近100%。 二.效率低下的HashTable 多個執行緒訪問HashTable的同步方法,會引起阻塞或輪詢狀態。 三.Concurre

高階BASH 程式設計 筆記BASH 入門

 最近看高階BASH程式設計一書,說以記下些覺得有用的東西。 1. 指令碼中的“#!”字元,這兩個字元其實是兩個位元組的魔法字元,後面接路徑名,指定用來解釋指令碼的程式。     例如:     #!/bin/bash     #!/bin/ksh 當我們的指令碼中的第一行

JavaScript學習筆記—— 異步編碼

加載 scree 鼠標位置 函數名 timestamp pagex 觸摸 切換 text 第七章 異步編碼 1 事件處理程序 處理程序:即網頁加載完畢後將執行的代碼,稱回調函數或監聽器; 包含:處理函數+window.onload=函數名; 1 <script

JavaScript學習筆記防篡改對象

ext 可擴展 ... boolean ava onf span class sse 1. 不可擴展對象 可寫,可刪除,不可新增 Object.preventExtensions(obj) Object.isExtensible(obj) 2. 密封對象

MySQL學習筆記—— MySQL自連接

概念 cor 子查詢 ron 表操作 例子 質量 _id order by 有的時候我們需要對同一表中的數據進行多次檢索,這個時候我們可以使用之前學習過的子查詢,先查詢出需要的數據,再進行一次檢索。 例如:一張products表,有產品id,供應商id(vend_

學習筆記

tde 監聽 文本 ren 頁面 define www 顯示 back BUG集錦:1. storage on 事件監聽必須兩個頁面同時打開,且處於服務器訪問狀態2. submit 和 button 不能套在 a 裏面,否則 submit 事件將消失3. 新建 Object

機器學習筆記邏輯回歸

邏輯回歸 alt 表示 結果 不變 改變 最小值 nbsp 可能性 一、邏輯回歸問題 二分類的問題為是否的問題,由算出的分數值,經過sign函數輸出的是(+1,-1),想要輸出的結果為一個幾率值,則需要改變函數模型 ,其中,, 則邏輯回歸的函數為 二、邏輯回歸錯誤評價 線性

IDEA使用筆記——設置項目的JDK配置

shift pro (六) ima 發現 打開 cnblogs ctr alt+ 1:由於dev分支和master分支的代碼差異比較多,所以,就從master上分出一個新的分支dev_,於是我就克隆新的代碼,打開對應的項目文件,然後啟動試試,發現報出如下的錯誤,很明顯是因為

jquery學習筆記插件的編寫

function jquery 命名方式 一、對jQuery對象的擴展;(function($){ $.fn.extend( { fun1:abc,fun2:1bc … } )})(jQuery)二、對jQuery本身的擴展,相當於靜態方法;(function($){ $

Python學習筆記map/reduce

code image 但是 oat tools col .com 參數 map() 摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178

Unity3D之Mecanim動畫系統學習筆記:使用腳本控制動畫

ont nim 復制代碼 info rip esc enter machine images 控制人物動畫播放 這裏我重新弄了一個簡單的場景和新的Animator Controller來作為示例。 下面先看看Animator Controller的配置: 人物在站

如鵬網學習筆記ADO.Net基礎

direct 問題 .... 數據庫連接 sta adapter query 寫到 數據類型 ADO.Net基礎 一、ADO.Net簡介   1,程序要通過SQL語句自動化的操作數據庫,必須要用一個類庫,     類庫要提供execute("insert into ...

SpringMVC筆記SpringMVC的轉發和重定向

配置文件 turn 返回 請求 字符串類型 情況 spring 讓我 ota 一、轉發和重定向 一般情況下,控制器方法返回字符串類型的值會被當成邏輯視圖名處理 如果返回的字符串中帶 forward: 或 redirect: 前綴 時,SpringMVC 會對他們進行特殊處理