函数是对象,它与其它对象唯一的不同是它可以调用。函数可实现:代码复用、信息隐藏、代码组合调用。

建立函数时会建立:上下文、调用函数的代码。每个函数(除Function.prototype)都会有一个原型对象。

   function foo ( ) {
//code
} foo.prototype = {constructor:this};

它必有一个foo.prototype对象,而且这是显含的。

函数字面量属于字面量,也就属于表达式的范畴。从而可以使用表达式的地方就可以使用函数字面量。

JS函数的参数是按值传递的。它不会检查传入实参的类型、个数;若实参少于形参实参函数调用时的形参值为undefined.每个函数会this,this在函数执行时才会确定,与函数的调用方式相关(与动态作用域有某种相似)。调用方式分为:方法调用、函数调用、构造器调用、apply调用。

方法调用:也就是说一个函数为某个对象的属性值。那么函数调用时的this到底是哪个?

我要再次强调,对象会有自己默认的原型链,同时我们可以设置对象的prototype属性,但这个属性与内部的原型链相比很弱,对象的"继承"或更确切的说是委托是基于内部原型链的。

   var a = {};
var b = {"name":"name"};
a.prototype = b;
console.log(a.name) //undefined Object.setPrototypeOf(a,b);
console.log(a.name) //"name"

开始,我直接设置prototype属性,然后以为通过对象的继承可以访问到对象b中的name;事实是:此时a与b的原型链链接到了Object.prototype。

接着,我真正修改了原型链,故可以访问到name属性。

那么,这个表面的prototype有何用?

前文提到函数(除Function.prototype)总会有一个对象与之对应。若我建立一个用函数建立一个对象的话,就会有用。新建的对象的原型链中的上一环为构造函数的prototype对象。

 function foo () {}
//那么一定有一个foo.prototype对象。
var b = new foo();
该对象的原型链中就会有 b 的存在
foo.prototype.isPrototypeOf(b) //true

其三,一般函数的原型链中不含prototype对象。但Function.prototype为function(){},且位于Function的原型链中。

Function.prototype.isPrototypeOf(Function)        //true.

回到刚才的问题,方法调用函数时,对应的this为何值。我直接给出结论,我认为是:可以直接查找到方法的那个对象。直接上代码。

   var a = {"a":"a"};
var b = {"b":"b"};
var c = {"c":"c",
"show":function(){
return this;
}
};
Object.setPrototypeOf(b,c);
Object.setPrototypeOf(a,b);
//现在原型链从a开始到b到c到Object.prototype. a.show(); //对象a
b.show(); //对象b //Function的例子 Function.prototype.method = function (name,func) {
this.prototype[name] = func;
return this;
};
// this与调用方式有关

干脆更加明白一些。

   Function.prototype  //    function () {}
Function.protoype.demo = function () {
console.log(this);
}; //可以通过Function这个函数访问到demo方法, Function.demo() // function Function() { [native code] } Function.prototype.demo() // function () {}

所以,不是方法在那个对象中this就是哪个。

函数调用的时候的this值。

直接调用函数是this是全局对象而非该函数的外围的this值,ES6中有语法糖来处理这个问题。

构造函数模式的this

new + 构造函数会形成一个对象,这里忽略其他细节;只讲this值,这时的this是新建立的那个对象。还是举个栗子。

   function foo (name) {
this.name = name;
} var obj = new foo (); //也就是说foo执行时的this是obj,从而才有给obj添加name属性的可能

构造函数与一般函数没有区别,但是若一个函数建立的目的是用于建立对象,应当把其首字母大写;否则直接调用可能会给全局对象添加属性。

apply调用模式

函数是对象,所以可以有方法,apply/call就是方法。伪代码:function.apply(this,argumnets),function.call(this,p1,p1,p1)。

记忆

     记忆这种优化手段真是让人兴奋,它可以大大减少计算的工作量,例如在阶乘、裴波那契数列的计算中,若不采用优化,那浏览器甚至算不出来。采用优化后秒算出结果。下面是通用的记忆器。

 function memoizer (memo,formula) {
var recur = function (n) {
var result = memo[n];
if ( typeof result !== "number") { result = formula();
memo[n] = result;
}
return result; }
return recur;
}

JS的函数化很强大,这种方法在一个个函数的基础上差异化继承,也可以增强;也是建立部件的基础。实现对象与它的功能模块的扩充。建立对象与方法之间的松散耦合。

    var o = {name:"demo"};
var enhance = function (o) {
var that = o;
if ( !o.name) {
o.name = "initial";
}
if ( !o.get_name) {
o.get_name = function () {
return o.name;
};
}
return that;
};
var b = enhance(o);

JS 精粹( 函数)的更多相关文章

  1. JS回调函数全解析教程

    转自:http://blog.csdn.net/lulei9876/article/details/8494337 自学jQuery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速g ...

  2. 学习js回调函数

    <!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <title> ...

  3. 如何理解JS回调函数

    1.回调函数英文解释: A callback is a function that is passed as an argument to another function and is execut ...

  4. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  5. 【转】关于URL编码/javascript/js url 编码/url的三个js编码函数

    来源:http://www.cnblogs.com/huzi007/p/4174519.html 关于URL编码/javascript/js url 编码/url的三个js编码函数escape(),e ...

  6. js引出函数概念的案例

    js引出函数概念的案例   1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8&q ...

  7. prototype.js $F()函数介绍

    $F()是一个能够简化编码量的函数, 对于字段输入控件有效,包括input.textarea.select等,该函数的输入参数为这些输入控件元素对象的id或元素对象本身,函数负责返回 这些输入控件元素 ...

  8. JS匿名函数的理解

    js匿名函数的代码如下:(function(){ // 这里忽略jQuery 所有实现 })(); 半年前初次接触jQuery 的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的 ...

  9. js回调函数(callback)理解

    Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...

随机推荐

  1. 反对抄袭 正解spring的@Autowired 不要相信网上的错误版本

    首先,最重要的, @Autowired的就是用来来消除 set ,get方法. 有些介绍,如著名的马士兵,说要在set方法上进行注入.我当时就看不明白了,既然只取消了一个GET,这个@Autowire ...

  2. 【设计模式】学习笔记13:组合模式(Composite)

    本文出自   http://blog.csdn.net/shuangde800 认识组合模式 上一篇中,我们可以用迭代器来实现遍历一个集合(数组,ArrayList, Vector, HashTabl ...

  3. 【二进制拆分多重背包】【HDU1059】【Dividing】

    Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. jQuery的主要用法

    一.选择网页元素jQuery的基本设计和主要用法,就是"选择某个网页元素,然后对其进行某种操作".这是它区别于其他函数库的根本特点. 使用jQuery的第一步,往往就是将一个选择表 ...

  5. UVa 821 Page Hopping

    题意: 给出一个有向图,求所有路径(两点间的最短路径)的平均值. 分析: 用floyd求两点间的最短距离,然后求平均就好. 代码: #include <iostream>#include ...

  6. java中驼峰与下横线格式字符串互转算法

    public static final char UNDERLINE = '_'; /** * 驼峰格式字符串转换为下划线格式字符串 * * @param param * @return */ pub ...

  7. 看懂此文,不再困惑于 JS 中的事件设计

    看懂此文,不再困惑于 JS 中的事件设计 今天刚在关注的微信公众号看到的文章,关于JS事件的,写的很详细也很容易理解,相关的知识点都有总结到,看完就有种很舒畅的感觉,该串起来的知识点都串起来了.反正一 ...

  8. (转载)iscroll.js的使用

    入门 Scroll是一个类,每个需要使用滚动功能的区域均要进行初始化.每个页面上的iScroll实例数目在设备的CPU和内存能承受的范围内是没有限制的. 尽可能保持DOM结构的简洁.iScroll使用 ...

  9. PHPStrom上传文件报502错误原因

    PhpStorm是一个轻量级且便捷的PHP IDE,其自身拥有apache类似的编译器,能够在无Apache的情况下运行,很适合初学PHPStrom的朋友. 但是我发现了一个问题,那就是用PHPStr ...

  10. python---__getattr__\__setattr_重载'.'操作

    #!coding:utf-8 class Person(object): def __init__(self,id): #定义一个名为ID的属性 self.ID=id def __getattr__( ...