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

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. js原生 + jQuery实现页面滚动字幕

    js原生/jQuery实现页面滚动字幕效果 17:45:49 在新闻列表或者文章列表信息等页面中很容易要求实现字幕滚动的效果,以下为简单的实现页面中滚动字幕的效果 1.jQuery实现页面滚动字幕效果 ...

  2. 最简单也最难——怎样获取到Android控件的高度

    问题 怎样获取一个控件的长和高.相信非常多朋友第一眼看见这个问题都会认为非常easy,直接在onCreate里面调用getWidth.getMeasuredWidth不就能够获得了吗,可是.事实上是并 ...

  3. Android开发之自定义圆角矩形图片ImageView的实现 - Jamy Cai

    android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆角矩形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap ...

  4. android gallery的使用

    1: xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xml ...

  5. html5 乒乓球(碰撞检测)

    演示地址 http://koking.8u.hanmandarin.com/html5/1.html 简单介绍 小球可以在方框内部自由运动 可以通过方向键控制黑色砖块上下左右移动去与小球发生碰撞 代码 ...

  6. 使用javascript oop开发滑动(slide) 菜单控件

    这里使用原生的javascript,用面向对象的方式创建一个容易维护使用方便的滑动菜单 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tra ...

  7. PHP 生成UUID的方法

                                                    .                 .                 .                ...

  8. < meta > 元素(转)

    < meta > 元素 概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 we ...

  9. css系列教程--选择器

    css派生选择器:是指在某个样式表或者dom元素的行内定义行内元素的属性,而其他同名样式在其他dom节点无效的样式表定义方式.例如:div ul li{border:1px solid red;}&l ...

  10. 转载 hashmap java8前的原理实现

    http://zhangshixi.iteye.com/blog/672697 1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允 ...