如果函数是一个对象的属性,那么它可以?

var katana = {
isSharp: true,
use: function(){
this.isSharp = !this.isSharp;
}
};
katana.use();
console.log( katana.isSharp );//false;

在javascript中,函数的内部,this默认指向调用它的对象。本例katana.use(),函数use被对象katana调用,所以在函数内部,this.isSharp可以操作katana.isSharp。

函数通过this引用的对象,就是上下文。

上下文到底代表什么?

function katana(){
this.isSharp = true;
}
katana();
console.log( isSharp === true, "特殊情况,全局变量的简写方式,this可以引用window对象的属性," ); var shuriken = {
toss: function(){
this.isSharp = true;
}
};
shuriken.toss();
console.log( shuriken.isSharp === true, "函数this引用调用它的对象" );

katana()=window.katana(),这个例子很明确的显示函数内部的this指向调用它的对象,这就是上下文。

函数的上下文是否可以改变?

var object = {};
function fn(){
return this;
}
console.log( fn() == this, "上下文是全局对象" ); //true
console.log( fn.call(object) == object, "上下文被改为指定对象" ); //true

call的用法,修改函数的上下文this为第一个参数。

改变上下文的不同方法:

function add(a, b){
return a + b;
}
console.log( add.call(this, 1, 2) == 3, ".call() 参数为多个" ); //true
console.log( add.apply(this, [1, 2]) == 3, ".apply() 参数为一个数组" ); //true

call和apply经常用来修改上下文,它们功能完全一样,只有一个区别:一个接收多个独立参数,一个接收单个数组作参数。

习题:补足代码,在回调函数里完成数组遍历

function loop(array, fn){
for ( var i = 0; i < array.length; i++ ) {
// 补足代码
}
}
var num = 0;
loop([0, 1, 2], function(value){
console.log(value == num++, "确保上下文为我们希望的.");
console.log(this instanceof Array, "上下文是数组实例");
});

解决数组遍历的一个方法

function loop(array, fn){
for ( var i = 0; i < array.length; i++ ) {
fn.call( array, array[i], i );
}
}
var num = 0;
loop([0, 1, 2], function(value){
console.log(value == num++, "确保上下文为我们希望的.");
console.log(this instanceof Array, "上下文是数组实例");
});

javascript高级知识分析——上下文的更多相关文章

  1. javascript高级知识分析——灵活的参数

    代码信息来自于http://ejohn.org/apps/learn/. 使用数量可变的参数对编程很有好处 function merge(root){ for(i = 0 ; i < argum ...

  2. javascript高级知识分析——实例化

    代码信息来自于http://ejohn.org/apps/learn/. new做了什么? function Ninja(){ this.name = "Ninja"; } var ...

  3. javascript高级知识分析——作为对象的函数

    代码信息来自于http://ejohn.org/apps/learn/. 函数和对象是不是非常相似? var obj = {}; var fn = function(){}; console.log( ...

  4. javascript高级知识分析——函数访问

    代码信息来自于http://ejohn.org/apps/learn/. 可以通过函数的名字在它的内部引用它. function yell(n){ return n > 0 ? yell(n-1 ...

  5. javascript高级知识分析——定义函数

    代码信息来自于http://ejohn.org/apps/learn/. 可以使用哪些方式来声明函数? function isNimble(){ return true; } var canFly = ...

  6. javascript高级知识点——指定上下文实现

    代码信息来自于http://ejohn.org/apps/learn/. 当我们将一个对象的点击事件绑定到一个事件触发元素时会发生什么? <ul id="results"&g ...

  7. JavaScript的高级知识---词法分析

    JavaScript的高级知识---词法分析 词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 函数在运行的瞬间, ...

  8. MySQL高级知识(七)——索引面试题分析

    前言:该篇随笔通过一些案例,对索引相关的面试题进行分析. 0.准备 #1.创建test表(测试表). drop table if exists test; create table test( id ...

  9. MySQL高级知识(五)——索引分析

    前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...

随机推荐

  1. 怎么去掉word标题前的黑点

    原文地址:http://jingyan.baidu.com/article/9c69d48f593c5b13c9024e2c.html 我们在使用word时,标题前总是出现黑点,其实这个黑点在打印时是 ...

  2. VC6使用技巧

    1.检测程序中的括号是否匹配 把光标移动到需要检测的括号(如大括号{}.方括号[].圆括号()和尖括号<>)前面,键入快捷键“Ctrl+]”.如果括号匹配正确,光标就跳到匹配的括号处,否则 ...

  3. php float 转int

    round(x,prec) 参数 描述 x 可选.规定要舍入的数字. prec 可选.规定小数点后的位数. <?php echo(round(0.60)); echo(round(0.50)); ...

  4. uitableview 优化

    1. http://www.cocoachina.com/ios/20150602/11968.html 最近在微博上看到一个很好的开源项目VVeboTableViewDemo,是关于如何优化UITa ...

  5. gcc选项-g与-rdynamic的异同

    摘自http://www.tuicool.com/articles/EvIzUn gcc选项-g与-rdynamic的异同 gcc 的 -g ,应该没有人不知道它是一个调试选项,因此在一般需要进行程序 ...

  6. N1必备外来语

    201412: キャリア: ノルマ:(normal)定额,劳动基本定额. チーフ: コスト: バンド:[英] band;皮带,腰带:吹奏乐团,轻音乐乐团(演奏者の一団.楽団.楽隊):营居群 [2014 ...

  7. git 在苹果系统中的一些命令

    下面是在mac下使用git的一些命令的使用,如果想参看原文使用xcode来处理git,可以进入下面的链接,不过是英文的. 使用终端命令终端: cd /Users/Malek/desktop/GitUs ...

  8. UIScrollView 与 UIPageView 的联合使用

       @interface ViewController : UIViewController<UIScrollViewDelegate> { UIScrollView * scrollV ...

  9. 【Tarjan,LCA】【3-21个人赛】【problemD】

    Problem D Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Sub ...

  10. C#中byte[] 与指针

    本文假定读者熟悉byte[].指针. C#是类型安全的,默认是不允许使用指针,但是针对C\C++或者其他语言的程序员(delphi)转为使用C#的的工作人员,不适用指针觉得很别扭.下面介绍一下基础的指 ...