this基础(转)

var someuser = {
    name: ‘byvoid‘,
    func: function() {
        console.log(this.name);
    }
};
var foo = {
    name: ‘foobar‘
};

someuser.func(); // 输出 byvoid

foo.func = someuser.func;
foo.func(); // 输出 foobar

name = ‘global‘;
func = someuser.func;
func(); // 输出 global

在 JavaScript 中,上下文对象就是 this 指针,即被调用函数所处的环境。上下文对象的作用是在一个函数内部引用调用它的对象本身。
在 JavaScript 中,本质上,函数类型的变量是指向这个函数实体的一个引用,在引用之间赋值不会对对象产生复制行为。我们可以通过函数的任何一个引用调用这个函数,不同之 处仅仅在于上下文。
仔细观察上面的例子,使用不同的引用来调用同一个函数时,this 指针永远是这个引用所属的对象。

var scope = ‘top‘;
var f1 = function() {
    console.log(scope);
};
f1(); // 输出 top
var f2 = function() {
    var scope = ‘f2‘;
    f1();
};
f2(); // 输出 top

函数作用域的嵌套关系是定义时决定的,而不是调用时决定的,也就 是说,JavaScript 的作用域是静态作用域,又叫词法作用域,这是因为作用域的嵌套关系可 以在语法分析时确定,而不必等到运行时确定。

请看下面的实例:

function test() {
    alert(arg);
    var arg = 1;
}
test();

这段代码在运行时报错“undefined”

function test() {
    alert(arg);
    this.arg = 1;
}
test();

这段代码在编译时报错“arg is not defined”

var arg = 2;
function test() {
    alert(arg);
    var arg = 1;
}
test();

这段代码依然是在运行时报错“undefined”

var arg = 2;
function test() {
    alert(arg);
    this.arg = 1;
}
alert(arg);
test();
alert(arg);

这段代码运行正常,三次的显示分别是:2、2、1。可见函数内的this.arg改变了全局变量的值,也就是现在this指代的是window对象。也就是上面的代码等价于下面的代码:

var arg = 2;
function test() {
    alert(arg);
    this.arg = 1;
}
alert(arg);
window.test();
alert(arg);

我们换一个对象实例看看:

var arg = 2;
function test() {
    alert(arg);
    this.arg = 1;
}
alert(arg);
var t = new test();
alert(t.arg);
alert(arg);

现在,前后全局变量arg的值未发生变化,说明当前的this指代的是t不再是window。

我们再次进行验证:

function test() {
    this.arg = 1;
}
test();
alert(arg);

此时弹出1,验证ok!可见函数和变量默认的属主就是window对象。

我们再实验一个例子:

function test() {
    var arg = 1;
    alert(arg);
}
test();
alert(arg);

此代码先弹出1,再报编译时错误“arg is not defined”,可见函数内的arg只是局部变量不影响window对象,window.arg依然未定义。

我们发挥想象力进一步拓展:

function test() {
    this.msg = function(i){alert(i);}
}
test();
msg(‘ok‘);

上面的代码如愿的弹出了“ok”!因为msg也不过是一个指向函数的指针变量,它指向了一个无名函数,当执行test时,此函数即时创建,同样属于window的属性。

实验一个指向函数变量的非this例子

function test() {
    var msg = function(i){alert(i);}
    msg(1);
}
test();
msg(2);

上面的代码,先弹出“1”,然后报编译错误“msg(2):msg is not defined”。可见函数内没有this修饰的msg只是函数内局部可用的函数指针,外部无法调用。

总结:对于函数内的变量(包括指向函数的指针变量)来说,this关键字总是指代调用该函数的对象。当单独调用函数时,调用它的对象由window引用;当用var t = new test()方式调用时调用它的对象由t引用。

  

时间: 2024-08-28 20:32:36

this基础(转)的相关文章

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解到底可以做什么呢? 1.注解的作用. 提供用来完整地描述程序所需要的信息,如编译期校验程序信息. 生成描述符文件,或生成新类的定义. 减轻编写"样板"代码(配置文件)的负担,可以使用注解自动生成. 更加干净易读的代码. 编译期类型检查. 2.Java提供的注解 Java5内置了一些原生的注

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

【Linux系列】【基础版】第四章 Shell基础之正则表达式

4. Shell基础之正则表达式     4.1 正则就是一串有规律的字符串         4.1 grep              4.1.1 格式: grep [-cinrvABC] 'word' filename             4.1.2 -c //count,表示行数             4.1.3 -i //不区分大小写             4.1.4 -n  //显示行号             4.1.5 -r  //遍历所有子目录             4

NumPy基础:数组和失量计算

NumPy : Numerical Python,是高性能科学计算和数据分析的基础包. 部分功能: ndarray:一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组: 用于对整组数据进行快速运算的标准数学函数(无需编写循环): 用于读写磁盘数据的工具以及用于操作内存映射文件的工具: 线性代数.随机数生成以及傅里叶变换功能: 用于集成C.C++.Fortran等语言编写的代码工具: 大部分数据分析应用关注的功能: 用于

css基础

css绝对是一个能够写到爆炸的东西,so,机智的小北方才不会写各种css样式具体的效果,相比之下更推荐大家记一些常用的key,至于效果,每次用的时候百度下就可以了, css的作用是对符合条件的标签进行渲染,那么首先就要匹配到对应标签啦,我萌有三种基础的模式来匹配希望改变样式的标签 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8">

零基础的人该怎么学习JAVA

对于JAVA有所兴趣但又是零基础的人,该如何学习JAVA呢?对于想要学习开发技术的学子来说找到一个合适自己的培训机构是非常难的事情,在选择的过程中总是 因为这样或那样的问题让你犹豫不决,阻碍你前进的步伐,今天就让小编为您推荐培训机构新起之秀--乐橙谷Java培训机构,助力你成就好未来. 选择java培训就到乐橙谷 北京有什么好的Java培训机构?来乐橙谷北京学Java,零基础走起,乐橙谷Java基础班授课老师经验非常丰富,课程内容安排合理,适合于有一点点Java基础甚至一点都不会Java的同学学

linux+jmeter+python基础+抓包拦截

LINUX 一 配置jdk 环境 *需要获取root权限,或者切换为root用户 1.windows下载好,去 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 官方网站下载jdk(linux相应版本) 2.在usr目录下创建java路径文件夹 [root bin]cd /usr mkdir java 3.将jdk-8u60-linux-x64.tar.gz放到刚才创建的文件夹下

python基础之条件循环语句

前两篇说的是数据类型和数据运算,本篇来讲讲条件语句和循环语句. 0x00. 条件语句 条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python interprets non-zero values as True. None and 0 are interpreted as False. Python 判断非0的值为 True, 而None和0被认为是 False.注意这里的True和False首字母大写,Py

【转】Java基础知识总结

写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思路体现出来. 学习新技术的四点: 1,该技术是什么? 2,该技术有什么特点(使用注意): 3,该技术怎么使用.demo 4,该技术什么时候用?test. ------------------------------------------------------------------------------------