前一阶段看到大神在网上贴出的测试个人js理解的代码。

在此我在此借用大神的代码,进行自我复述,大神文章参见:http://www.imooc.com/article/1731

代码1:

function foo(){
console.log(this.a);
}
function doFoo(fn){
fn();
}
function doFoo2(o){
o.foo();
}
var obj = {
a: 2,
foo: foo
};
var a = "I'm an a";
doFoo(obj.foo);
doFoo2(obj);

我的理解:

先说doFoo(obj.foo)

传入的参数obj.foo即对象obj的元素foo,内容为foo。

此时传入的foo在方法doFoo中就变成了调用foo()方法。

因为foo()是定义在最外层的,此时的this指向最外层对象window,所以取得的a应该是在最外层定义的 var a = "I'm an a";。

所以第一个方法返回的是I'm an a。

其次说doFoo2(obj)

传入的参数是obj对象.

此时在doFoo2中调用的是obj.foo()。

这时foo()方法中的this重新指向了obj对象,所以this.a取得的是obj对象中的a。

所以第二个方法返回的是2.

大神的分析:

在Javascript中,this指向函数 执行时的当前对象,而非声明环境有
执行doFoo的时候执行环境就是doFoo函数,执行环境为全局。
执行doFoo2时是在对象内部调用函数,this指针指向该对象。

代码2:

function foo(somthing){
console.log(this.a, somthing);
}
function bind(fn, obj){
return function(){
return fn.apply(obj, arguments);
}
}
var obj = {
a:2
}
var bar = bind(foo, obj);
var b = bar(3);
console.log(b);

第二段代码,再次先说我自己的理解:

结论先行:这里展示apply的作用-修改方法作用的对象,也可以说是修改this的指向

解释:

原本在foo函数的定义中,this指向的是全局对象,而在函数bind中,利用apply,bind将this指向了obj,即fn方法实际作用在obj上了。

之后的代码便是定义一个obj对象直接量,然后将利用bind方法将foo方法的作用对象指向了obj,最后再通过定义的bar传入参数"3"。

也就是说,在最后bar(3)执行的时候,调用的方法foo作用于对象obj上(这里的obj指的是已经定义的对象直接量),所以方法执行的是下面的内容:

console.log(obj.a,3);

而obj的a是2,所以输出的内容是2 3。

再次看大神的分析,发现自己漏掉了最后方法没有返回参数,所以还会返回一个undefined。

贴上大神的分析:

apply、call、bind都有个作用就是改变作用域,这里用apply将foo函数的作用域指向obj对象,同时传入参数。
再简单分析一下bind函数内部的嵌套,执行bind函数的时候返回的是一个匿名函数,所以执行bar(3)的时候实际上是执行的bind内部的匿名函数,返回的是之前传入的foo函数的执行结果。
函数没有返回值的情况下默认返回undefined。

代码3:

function foo(a,b){
this.val = a+b;
}
var bar = foo.bind(null, 'p1');
var baz = new bar('p2');
console.log(baz.val);

未完待续

javascript之观码说理的更多相关文章

  1. Javascript 二维码生成库:QRCode

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. JavaScript特效源码(1、文字特效)

    注:本文以及以下关于Javascript特效源码都是分享自JavaScript源码大全. 1.逐隐逐现的的特效 逐隐逐现的文字特效[推荐使用][适用于IE4++] (修改显示的文字后根据说明进行共2步 ...

  3. JavaScript二维码生成——qrcode.js

    在开发中,有时候,我们需要根据不同的内容来动态生成二维码,则可以使用qrcode.js这个小插件来实现. 1.qrcode.js文件内容: (1)未压缩(qrcode.js): /** * @file ...

  4. javascript Base64转码解码

    javascript 使用btoa和atob来进行Base64转码和解码 $scope.checkAddCookie = function() { var expireDate = new Date( ...

  5. 使用C#重写网上的60行 Javascript 俄罗斯方块源码 (带注释)

    在很久很久以前,就已经看过 60行Js的俄罗斯方块源码.无奈当时能力不够看明白,当时觉得就是个神作. 现在总算有空再看了,顺便用c#实现一遍(超过60行),顺道熟悉下Js API. 网上其他博客也有分 ...

  6. JavaScript特效源码(4、鼠标特效)

    1.鼠标感应--渐现特效 鼠标感应渐显图片[平时很模糊的图片鼠标一放上就显示清楚] [修改图片名称即可][共2步] ====1.将以下代码加入HTML的<head></head> ...

  7. JavaScript特效源码(8、其他特效)

    1.中文日期 中文日期[无须修改][共1步]] ====1.将以下代码加入HEML的<body></body>之间 <script LANGUAGE="Java ...

  8. JavaScript特效源码(7、页面特效二)

    7.将站点加入频道栏 将站点加入频道栏[看详细说明] ====1.加入channel的方法:使用如下连接指向你的频道文件*.cdf. <a href="javascript:windo ...

  9. JavaScript特效源码(6、页面特效一)

    1.页面全屏 页面全屏显示[ALT+F4关闭][共1步][新弹出窗口并以全屏幕方式显示] ====1.将以下代码加入HTML的<body></body>之间: <form ...

随机推荐

  1. 剑指Offer:面试题22——栈的压入,弹出序列(java实现)

    题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

  2. 重装系统分区时,发现一个叫LVM的东西,找出来和大家分享

    LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,目前 ...

  3. Python:if __name__ == '__main__'

    很多模块里都会看到这句话,一般用于模块自测时使用. 所有的模块都有一个内置属性 __name__. 一个模块的 __name__ 的值取决于您如何应用模块. 一个Python文件有两种使用方式,直接使 ...

  4. MFC重载关闭按钮

    首先介绍一下WindowProc函数. 函数功能:该函数是一个应用程序定义的函数.它处理发送给窗口的消息.WNDPROC类型定义了一个指向该回调函数的指针.WindowProc是用于应用程序定义函数的 ...

  5. 使用Java修改Windows注册表

    使用Java修改Windows注册表,使用最基本的就是cmd命令. 事例和运行结果如下所示: package day01; import java.io.IOException; /* 1,reg a ...

  6. Lighttpd虚拟主机和多域名的配置

    lighttpd是个轻巧的web服务器组件,在linux系统上较为流行,功能能满足一般网站的需求(虚拟主机,伪静态,防盗链等),而跑起来负载却低于apache. 一般网站地址的形式为www.xxx.c ...

  7. Oracle客户端与服务器字符集不统一的处理

    当Oracle客户端与服务器的字符集不统一时. 症状: 如:ORA-00283: ?????????? 提示信息中有好多问号. 解决方法: 1查询服务器的字符集: SQL> conn / as ...

  8. 使用Python来对MySQL数据库进行操作

    使用Python对Mysql进行操作,前提是安装了python-Mysql的安装包,安装的方法有多种,可以使用easy_install或者pip  或者是源码进行安装. 下面介绍下如何使用Python ...

  9. TJI读书笔记09-访问控制权限

    TJI读书笔记09-访问控制权限 包,package和import 权限修饰符 接口和实现 类的访问权限控制 首先问一个问题,为什么要有访问控制权限? 安全,这当然是一个很重要的原因. 让类库的使用者 ...

  10. The certificate used to sign “AppName” has either expired or has been revoked. An updated certificate is required to sign and install the application解决

    问题 The certificate used to sign "AppName" has either expired or has been revoked. An updat ...