`
truth99
  • 浏览: 63231 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

javascript 精粹第二篇(函数)

阅读更多

下面代码要用到之前博客中的代码,在执行的时候请将其中的代码引入,否则报错。

console.log('************************************************************************调用(方法调用模式、函数调用模式、构造子调用模式和Apply调用模式)');

console.log('第一种模式:方法调用模式');
//当一个函数被保存为对象的一个属性时,我们称它为一个方法,
//如果调用表达式包含一个提取属性的动作(即包含一个 . 点表达式或[subscript]下标表达式),
//那么它就是被当做一个方法来调用 。当一个方法被调用时,this被绑定到该对象。
myObject = {
	value : 0,
	increment : function(inc){
		this.value += typeof inc === 'number' ? inc : 1;
	}
};
myObject.increment();
console.log(myObject.value);
myObject.increment(5);
console.log(myObject.value);

console.log('第二种模式:函数调用模式');
//当一个函数并非一个对象的属性时,那么它就是被当做一个函数来调用。
//在内部函数被调用的时,this应该仍然绑定到外部函数的this变量。
//解决办法是在外部函数定义一个变量并给它赋值为this,那么内部函数就可以通过那个变量访问到this。
//按照约定,把那个变量命名为that。
myObject.double = function(){
	var that = this; //解决方案
	var helper = function(){
		console.log("为赋值给that变量前:",this);
		console.log("为赋值给that变量后:",that);
	};
	helper(); //以函数的形式调用 helper
};
// 以方法的形式调用
myObject.double();

console.log('第三种模式:构造器调用模式');
var Quo = function(string){
	console.log(this);
	this.status = string;
};
Quo.prototype.get_status = function(){
	return this.status;
};
//在使用new时,this绑定具体实例
var myQuo = new Quo('confused');
console.log(myQuo.get_status());
//不使用new时,this绑定window
var myQuo2 = Quo('con');
console.log(myQuo2 && myQuo2.status);
console.log(window.status);

console.log('第四种模式:Apply调用模式');
var statuObject = {
		status : 'A-OK'
};
console.log(Quo.prototype.get_status.apply(statuObject));


console.log('************************************************************************异常');
var add = function(a,b){
	if(typeof a !== 'number' || typeof b !== 'number'){
		throw{
			name : 'typeError',
			message : 'add need number'
		};
	}
	return a+b;
};
(function(){
	try{
		console.log(add('d',2));
	}catch(e){
		document.write(e.name);
		console.log(e.name+':'+e.message);
	}
})();


console.log('************************************************************************扩充类型的功能');
Function.prototype.method = function(name,func){
	//基本类型的原型是公用结构,所以在类库混用时务必小心。在确定没有该方法时才添加它。
	if(!this.prototype[name]){
		this.prototype[name] = func;
	}
	return this;
};

Number.method('integer',function(){
	return Math[this < 0 ? 'ceil' : 'floor'](this);
});
console.log((-10/3).integer());
//通过method方法构造string转换成int函数
String.method('toInteger',function(){
	var newStr = '';
	var str = this || '';
	for(var i=0;i<str.length;i++){
		if(str.charCodeAt(i) < 58){
			newStr += str.charAt(i);
		}
	}
	return parseInt(newStr) || '';
});
console.log('2222dd33'.toInteger());


console.log("************************************************************************闭包(看页面的渐变效果)");
var fade = function(node){
	var level = 1;
	var step = function(){
		var hex = level.toString(16);
		node.style.background = '#' + hex + hex + hex + hex + hex + hex;
		if(level < 15){
			level++;
			setTimeout(step,40);
		}else{
//			console.log("结束");
		}
	};
	setTimeout(step,40);
};
fade(document.body);
// 构造一个函数,用错误的方式给一个数组中的节点设置时间处理程序。
//当点击一个节点时,按照预期,应该弹出一个对话框显示节点的序号,
//但它总是会显示节点的数目。

/*
  	var add_the_handlers = function(nodes){
		var i;
		for(i = 0;i<nodes.length;i++){
			nodes[i].onclick = function(e){
				alert(i);
			};
		}
	};
*/

//改良后的例子
var add_the_handlers = function(nodes){
	var i;
	var helper = function(i){
		return function(e){
			alert(i);
		};
	};
	for(i = 0;i<nodes.length;i++){
		nodes[i].onclick = helper(i);
	}
};
//(这个我也不是太清楚是怎么回事,有懂的大牛们希望指点)


console.log("************************************************************************模块");
//模块模式的一般形式是:一个定义了私有变量和函数的函数;
//利用闭包创建可以访问的私有变量和函数的特权函数;
//最后返回这个特权函,或者把它们保存到一个可以访问的地方。
String.method('deentityify',function(){
	var entity = {
		quot : '"',
		lt : '<',
		gt : '>'
	};
	return function(){
		return this.replace(/&([^&]+);/g,function(a,b,c){
			//a 表示/&([^&;]+);/g匹配的结果,b表示([^&;]+)匹配的结果,c表示的字符串
			console.log(a,b,c);
			var r = entity[b];
			return typeof r === 'string' ? r : a;
		});
	};
}());
console.log('&lt;&quot;&gt;'.deentityify());
var serial_maker = function(){
	var prefix = '';
	var seq = 0;
	return {
		set_prefix : function(p){
			prefix = String(p);
		},
		set_seq : function(s){
			seq = s || seq;
		},
		getsym : function(){
			var result = prefix +seq;
			seq ++;
			return result;
		}
	};
};
var seqer = serial_maker();
seqer.set_prefix('T');
seqer.set_seq(1024);
console.log(seqer.getsym());
seqer.set_prefix('D');
seqer.set_seq();
console.log(seqer.getsym());
//seqer.getsym = function(){
//	return prefix;
//};
//console.log(seqer.getsym());  //Uncaught ReferenceError: prefix is not defined


console.log("************************************************************************级联");
//在没有返回值的方法中加入返回this,就可以启动级联。在级联中,我们可以在单独一条语句中一次调用一个对象的很多方法。
var user_maker = function(){
	var user = {
		name : "truth",
		sex : "male",
		age : 24
	};
	return {
		set_name : function(n){
			user.name = n;
			return this;
		},
		set_sex : function(s){
			user.sex = s;
			return this;
		},
		set_age : function(a){
			user.age = a;
			return this;
		},
		add_user_info : function(key,value){
			user[key] = value || '';
			return this;
		},
		get :function(){
			return user;
		}
	};
};
var u = user_maker();
console.log(u.set_name('lee').add_user_info('weight','130kg').get());


console.log("************************************************************************记忆");
//函数可以将先前操作的寄过记录在某个对象里,从而避免无谓的重复运算。这种优化被称为记忆。
//下面的例子就是将算好的值存储在memo数组里减少不必要的重复计算,进而优化。
//斐波那契数列算法
var memoizer = function(memo,formula){
	var recur = function(n){
		var result = memo[n];
		if(typeof result !== 'number'){
			result = formula(recur,n);
			memo[n] = result;
		}else{
			console.log(memo[n]);
		}
		return result;
	};
	return recur;
};
var fibonacci = memoizer([0,1],function(recur,n){
	return recur(n-1)+recur(n-2);
});
console.log(fibonacci(10));


未完...见javascript精粹第三篇(继承)
分享到:
评论

相关推荐

    javascript精粹(源代码).rar

    《JavaScript精粹》一书深入浅出地探讨了这种语言的核心概念和技术,旨在帮助读者掌握JavaScript的魅力并提升编程技能。书中源代码的提供使得理论与实践相结合,加深了学习的体验。 1. **变量和数据类型**:...

    javascript精粹(英文版)

    2. **函数和作用域**:JavaScript的函数不仅仅是代码块,还是第一类对象,可以作为参数传递,也可以作为返回值。书中将详细阐述函数的创建、调用方式,以及作用域规则,特别是函数作用域和块级作用域的区别。 3. **...

    C#中JavaScript精粹

    第二种是关闭当前窗口并跳转到指定页面;第三种则是关闭父窗口。这三种方法都是通过JavaScript的`window.close()`函数实现的,可以结合C#的后台代码动态生成。 4. **Web MessageBox**:在ASP.NET中,可以使用`...

    JavaScript语言精粹.修订版---高清版.pdf

    2. **函数**:在JavaScript中,函数不仅是一段可重用的代码块,还是第一类对象(first-class object),这意味着它们可以作为参数传递给其他函数,也可以作为返回值从函数返回。 3. **控制结构**:包括条件语句(if....

    JavaScript(ppk谈JavaScript+JavaScript语言精粹修订+Secrets of the JavaScript Ninja)

    “JavaScript语言精粹(修订版)”可能是Douglas Crockford的著作,他是一位JavaScript的先驱者,对语言的某些部分进行了深入探讨,特别是关于代码风格、最佳实践和设计模式。这本书强调了JavaScript的精华部分,...

    JavaScript语言精粹3

    根据给定的信息,“JavaScript语言精粹3”似乎是一本关于JavaScript编程语言的书籍或教程资料。由于提供的部分内容主要为重复的版权声明与电子书下载站点链接,并没有直接包含具体的技术细节或者章节内容,我们将...

    JavaScript语言精粹_修订版

    2. **函数与闭包**:函数是JavaScript中的第一等公民,可以作为参数传递,也可以作为返回值。闭包是一种特殊的现象,允许函数访问并操作其词法作用域内的变量,即使该函数已经执行完毕。 3. **原型与继承**:...

    JavaScript语言精粹

    第2章 语法  2.1 空白  2.2 标识符  2.3 数字  2.4 字符串  2.5 语句  2.6 表达式  2.7 字面量  2.8 函数 第3章 对象  3.1 对象字面量  3.2 检索  3.3 更新  3.4 引用  3.5 原型  3.6 反射...

    JavaScript精彩网页特效实例精粹(全)

    本资源“JavaScript精彩网页特效实例精粹(全)”是一份全面的教程集合,包含了15个章节的实例教程,旨在帮助开发者深入理解和掌握JavaScript的网页特效制作技巧。 第十五章重点介绍了Ajax与XMLHttpRequest。Ajax,...

    JavaScript语言精粹(修订版)

    2. **函数与闭包**:函数是JavaScript中的第一等公民,可以作为值传递,也可以作为参数和返回值。闭包是JavaScript的一个重要特性,它允许函数访问并操作外部作用域的变量,即使该函数在其外部作用域已经执行完毕。 ...

    js-高性能JavaScript-JavaScript语言精粹修订版

    #### 五、《JavaScript DOM编程艺术第二版》 **知识点概述:** 1. **DOM基础:** - 学习DOM的基本概念和结构。 - 掌握DOM节点的属性和方法。 2. **DOM操作技术:** - 了解如何使用JavaScript操作DOM元素。 - ...

    JavaScript语言精粹(中文版PDF)part2

    第2章:语法 第3章:对象 第4章:函数 第5章:继承 第6章:数组 第7章:正则表达式 第8章:方法 第9章:代码风格 第10章:优美的特性 附录A:糟粕 附录B:鸡肋 附录C:JSlint 附录D:语法图 附录E:JSON 索引

    JavaScript精彩网页特效实例精粹

    13. **性能优化**:包括事件委托、防抖(debounce)和节流(throttle)技术,以及合理使用闭包和立即执行函数等,以提高JavaScript性能。 这些知识点都是JavaScript精彩网页特效实例精粹中可能涉及的内容,每个话题都...

Global site tag (gtag.js) - Google Analytics