指向对象、window、方法。

例子1

function a(){//当前调用栈是a,因此a的调用位置是全局作用域
    console.log('a');
    b();// b的调用位置
}
function b(){//当前调用栈是a->b,因此a的调用位置是a
    console.log('b');
    c();// c的调用位置
}
function c(){//当前调用栈是a->b->c,因此a的调用位置是b
    console.log('c');
}
a(); // a的调用位置
debugger;调试工具中分析call stack

例子2

function foo(){
    console.log(this.a);
}
var a = 2;
foo();

function foo(){
    'use strict'
    console.log(this.a);
}
var a = 2;
foo();

例子3

function test(){
    console.log(this.a);
}
var obj = {
    a: 2,
    test :test
}
obj.test();

例子4

function foo(){
    console.log(this.a);
}
var obj ={
    a:2,
    foo:foo
}
var bar = obj.foo;
var a = 3;
bar();

例子5

var x = 2;
function test()
{
 this.x = 1;
}
var b = new test();
alert("b.x: " + b.x);
b.x = 3;
test();
x*=10;
alert("b.x: " + b.x);
alert("x: " + x);
var b = {};
b.x = 4;
b.test = test;
b.test();
alert("b.x: " + b.x);
var b = {};
b.x = 4;
b.test = test;
x += 5;
b.test.apply();
alert("b.x: " + b.x);
alert("x: " + x);
var b = {};
b.x = 4;
b.test = test;
x += 5;
b.test.apply(b)
alert("b.x: " + b.x);
alert("x: " + x);

例子6

var name = "I am window";
var obj = {
    name:"xiaoming",
    job:"software",
    ftn01:function(obj){
        obj.show();
    },
    ftn02:function(ftn){
        ftn();
    },
    ftn03:function(ftn){
        ftn.call(this);
    }
};
function Person(name){
    this.name = name;
    this.show = function(){
        console.log("姓名:" + this.name);
        console.log(this);
    }
}
var p = new Person("Person");
obj.ftn01(p);
obj.ftn02(function(){
   console.log(this.name);
   console.log(this);
});
obj.ftn03(function(){
    console.log(this.name);
    console.log(this);
});

this的调用方式

作为函数的调用 getThis();

作为对象方法的调用 b.getThis = getThis; b.getThis();

作为构造函数的调用 var b = new getThis();

call()、apply()调用 b.getThis.apply();

情形一:传入的参数是函数的别名,那么函数的this就是指向window;

情形二:传入的参数是被new过的构造函数,那么this就是指向实例化的对象本身;

情形三:如果我们想把被传入的函数对象里this的指针指向外部字面量定义的对象,那么我们就是用apply和call

如果在javascript语言里没有通过new(包括对象字面量定义)、call和apply改变函数的this指针,函数的this指针都是指向window的

function A(){
    function initName(){
        this.name = '123';
    }
    initName();
}
var a = new A();
console.log(a.name);

这个例子中控制台打印的信息是undefined(想想为什么),怎样使a.name的值为‘123’呢?上面的this指向window,

在function中,使用this,如果没有new,那么this指向window。

方法1

function A(){
     var _this = this;
    function initName(){
        _this.name = '123';
    }
    initName();
}
var a = new A();
console.log(a.name);

方法2

function A(){
    function initName(){
        this.name = '123';
    }
    initName.call(this);
}
var a = new A();
console.log(a.name);

方法3

function A(){
    (function initName(that){
        that.name = '123';
    })(this);
}
var a = new A();
console.log(a.name);

方法4

function A(){}
A.prototype.initName = function(){
    this.name = '123';
}
var a = new A();
a.initName();
console.log(a.name);

方法5

function A(){
    var name;
    this.initName = function(){
        name = '123';
    }
    this.getName = function(){
        return name;
    };
    this.initName();
}
var a = new A();
console.log(a.getName());
function B(){
    A.call(this);
    b.getName();
}
var b = new B();
console.log(b.getName());

方法6

function A(){
    function initName(){
        this.name = '123';
    }
    return new initName(); } 

var a =A(); console.log(a.name);

场景二、

function A(){
       this.name='a';
   }
   A.prototype.name='b';
   var a=new A();
   //a.name='c';
   console.log(a.name);
   delete(a.name);
   console.log(a.name);

js寻找对象的方式,先在自身找,找不到才会去原型链上找。

在JavaScript中,this关键字指什么?的更多相关文章

  1. 深入解析Javascript中this关键字的使用

    深入解析Javascript中面向对象编程中的this关键字 在Javascript中this关键字代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function TestFun ...

  2. JavaScript中this关键字的使用比较

    JavaScript中this关键字的使用比较 this关键字在JavaScript中,用的不能说比较多,而是非常多.那么熟悉this关键字的各种用法则显得非常关键. this有时候就是我们经常说的上 ...

  3. 大前端学习笔记整理【五】关于JavaScript中的关键字——this

    写在前面 工作有那么一段时间了,但是在工作中,发现自己的理论知识还是有所欠缺.特别是在javascript上,很多东西其实自己属于知道要用这个,但是不知道为什么要这么用...这种情况很是尴尬了,所以写 ...

  4. javascript中new关键字详解

    和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...

  5. [No000069]Javascript中this关键字详解

    Quiz 请看下面的代码,最后alert出来的是什么呢?(chrome下按F12,选择Console直接复制粘贴运行) var name = "Bob"; var nameObj ...

  6. javascript中this关键字详解

    不管学习什么知识,习惯于把自己所学习的知识列成一个list,会有助于我们理清思路,是一个很好的学习方法.强烈推荐. 以下篇幅有点长,希望读者耐心阅读. 以下内容会分为如下部分: 1.涵义 1.1:th ...

  7. JavaScript中var关键字的使用详解

    作用 声明作用:如声明个变量. 语法 ? 1 var c = 1; 省略var 在javascript中,若省略var关键字而直接赋值,那么这个变量为全局变量,哪怕是在function里定义的. ? ...

  8. javascript中的关键字和保留字

    javascript中关键字的问题,将名称替换了下,确实就没有问题了.现在将它的关键字和保留字贴出来,便于日后查看和避免在次出现类似的问题. 1 关键字breakcasecatchcontinuede ...

  9. 深入了解JavaScript中的关键字

    this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用,下面分四种情况,详细讨论this的用法,感兴趣的朋友可以了解下. this是Javascri ...

  10. 对于JavaScript中this关键字的理解

    这是我第二遍学this了,第一遍学的懵懵的.this指哪里都是凭我一个男人的直觉然后控制台输出看看对不对. 刚查了书.博客.视频.理解差不多了.毕竟菜鸡me: 一.首先介绍下什么是this this是 ...

随机推荐

  1. 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.

    在网上看到过一个面试题,感觉挺有意思,看别人的代码写的逻辑不够谨慎,重写了一个,较真了又... package com.array7.algorithm; public class Algorithm ...

  2. MySQL sql语句总结

    1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 d ...

  3. javascript memoization递归优化

    memoize优化递归 function createRec(callback, cache) { cache = cache || []; var rec = function(n) { (n in ...

  4. PE刷题记录

    PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...

  5. 又是一个二模02,不过day2

    话说比较简单.除了第三题不会写平衡树啊你妹!!边做边写吧. 机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链 ...

  6. Python序列切片的注意事项

    a=[1,2,3,4,5,6,7,8,9,10] 1)普通切片,形如array[m:n],只包含起始索引m,和不被包含在结果内的终点索引n, 注意终点索引可以大于序列的大小(长度),若终点索引大于序列 ...

  7. Having与Where的区别

    where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行. having 子句的作用是筛 ...

  8. 完整java开发中JDBC连接数据库代码和步骤 JDBC连接数据库

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

  9. 转MYSQL学习(三) 函数

    这一节主要介绍MYSQL里的函数,MYSQL里的函数很多,我这里主要介绍MYSQL里有而SQLSERVER没有的函数 数学函数 1.求余函数MOD(X,Y) MOD(X,Y)返回x被y除后的余数,MO ...

  10. Linux下配置Hadoop 1.2.1

    首先要下载hadoop的包,版本选择1.2.1的,下载地址为:http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-1.2.1/ 这里可以下载hado ...