`
北极的。鱼
  • 浏览: 158944 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【原】关于JS中的作用域——this关键字

阅读更多

无论什么时候,javascript都会把this放到function内部

它是基于一种非常简单的思想——如果包含this的 (特别强调!每个函数都有this。看上面的那句话。)最近的 函数 直接是某个对象的成员。那么this的值就是这个对象。如果包含this的最近的函数 不是某个对象的成员,那么this的值便设为某种全局对象(常见为浏览器中的window对象)。

 

下面的内部函数可以清晰的看出这种思想。

一个函数,若是分配到某个变量的,即不属于任何对象下的一员,那么this的参数就变为window对象。

var obj = {
  toString:function(){//重写toString函数。这里说明下,默认情况下,Object对象都有一个toString的方法。
    return "obj的范围内";
  },
  func:function(){
    alert(this);//这里的函数直接从属于对象obj
    var innerFunc = function(){//这里的函数不是特定对象的直接成员,只是另一个函数的变量而已。
      alert(this);
    };
    innerFunc();
  }
};
obj.func()

 结果:

以此输出“obj的范围内”和“Object Window(FF下测试)”

 

但是我们可以人为的改变作用域,即改变this指向的对象。

如果最后一行代码换为obj.func.call(window)。

那么两次输出的结果都为“Object Window(FF下测试)”

 

从上面的例子可以发现,call实际是另外一个方法,属于JS的语言核心(Runtime)为obj.func提供的内建方法。

无论是哪一个函数,主要能够typeof foo == "function"是成立的,就必然有call的方法。

 

修改下代码:

var obj = {
  toString:function(){//重写toString函数。这里说明下,默认情况下,Object对象都有一个toString的方法。
    return "obj的范围内";
  },
  func:function(){
    alert(this);//这里的函数直接从属于对象obj
    var innerFunc = function(){//这里的函数不是特定对象的直接成员,只是另一个函数的变量而已。
      alert(this);
    };
    innerFunc.call(this);
  }
};
obj.func()

 这样,2次打印的结果都是"obj的范围内"。

 

 

 

1
0
分享到:
评论
2 楼 北极的。鱼 2011-08-14  
临时想到:
当我们在new一个对象的时候,类似:
var instance = new Demo();
这个instance和这个构造函数有什么关联呢?

我们知道,Demo中的this指向instance这个对象。
这个是js中this指针的作用。
除此之外,还有另一个深沉层的含义——继承。
new一个对象的时候,将确定这个对象在整个继承树,即原型链上的一个位置。
这句话,现在看来,就理解得更形象一点了。
1 楼 北极的。鱼 2011-08-14  
function demo(name,age){
    this.name = name;
    this.age = age;
}//这里this默认指向window

var obj ={};
obj.method = demo;//这里改变this的指向,现在指向了obj
obj.method("louis",26)
alert(obj.name+obj.age)//运行到这里看出,this确实指向了obj

var c = {method:obj.method}//这里改变this的指向,现在指向了c
c.method("ice",25)
alert(c.name+c.age)//运行到这里看出,this确实指向了c
alert(obj.name+obj.age)//运行到这里看出,this还是指向obj

var d = demo("echo",25);//这里改变this的指向,现在指向了window
alert(window.name+window.age);//运行到这里看出,this还是指向window

请记住判断this的最核心的3句话:
1.this是活跃的,在构造函数运行后,默认指向创建的那个实例对象。
2.但是每个方法中的this总是指向这个方法当前的调用者。
3.一个方法如果没有明确指明调用者,那么调用者默认就是window,即方法中的this指向window。

相关推荐

    js this关键字_面向对象编程.pdf

    ` 指令启用),`this` 在全局作用域中未绑定时为 `undefined`。 - **函数调用中**:当函数作为普通函数被调用时(而非构造函数或方法),`this` 的行为与全局上下文相同。 - **对象方法中**:在对象的方法中,`...

    深入理解javascript原型和闭包1

    JavaScript通过作用域链解决自由变量的查找问题,作用域链连接了当前作用域与上层作用域,允许在不同作用域中访问变量。 (15)——闭包 闭包是JavaScript中一种强大的特性,它允许函数访问并操作其词法作用域内的...

    Javascript學習筆記——JS的函數

    本篇文章将深入探讨JavaScript中的函数,包括它们的定义、参数、返回值、作用域以及一些高级特性。 1. 函数定义: 在JavaScript中,函数可以使用`function`关键字来定义。例如: ```javascript function sayHello...

    JS中的public和private对象,即static修饰符

    而在JavaScript中,由于其原型继承的特性,我们通常使用函数作用域和闭包来模拟这些行为。 下面我们将基于提供的示例代码来探索JavaScript中如何实现public、private属性和方法,以及模拟static效果。 1. public...

    最新版TypeScript教程——15.14_构造函数和this(Av800627522,P15).rar

    `this`关键字在JavaScript和TypeScript中扮演着核心角色,尤其是在对象的方法中。`this`总是引用当前上下文的对象,这取决于`this`被调用的方式。在构造函数中,`this`通常指代新创建的实例。但在其他情况下,`this`...

    Web-前端教程38 JS进阶:上下文.zip

    JavaScript是Web前端开发的核心语言,本教程聚焦于JS的进阶知识——上下文。在JavaScript中,上下文是一个至关重要的概念,它涉及到函数执行、作用域以及闭包等多个方面。理解上下文对于提升编程能力、避免常见错误...

    JavaScript动态网页开发详解——源文件

    - **函数**:函数定义、函数表达式、参数传递、作用域、闭包。 2. **进阶篇**: - **对象与属性**:对象字面量、构造函数、原型链、this指向、Object的方法(如assign、getOwnPropertyDescriptor等)。 - **数组...

    javascript视频教程

    7. **闭包**:闭包是JavaScript中的一个重要特性,允许函数访问并操作其外部作用域的变量,即使在其外部作用域已被销毁后依然有效。 8. **模块化**:JavaScript提供了多种模块化方案,如CommonJS(Node.js中使用)...

    contextSolo

    **JavaScript作用域** JavaScript有两种主要的作用域:全局作用域和局部作用域。全局作用域中的变量在整个脚本中都可访问,而局部作用域的变量仅在其定义的函数或块级作用域内有效。另外,ES6引入了块级作用域的概念...

    Java Script 经典教程(三)——java script 专业设计

    箭头函数的语法简洁,其this指向与父级作用域保持一致,解决了回调函数中this指向的问题。此外,我们还需要理解闭包的概念,它是JavaScript实现数据封装和模块化的一种方式。 在JavaScript中,对象是核心概念。通过...

    these

    【描述】: "本文将深入探讨JavaScript中的核心概念——this关键字及其在不同上下文中的应用,同时也会涉及到作用域的概念,包括全局作用域、函数作用域以及块级作用域。通过实例解析,帮助开发者深化对JavaScript...

    深化浅析JavaScript中的Function类型_.docx

    在全局作用域中,`this`通常指向全局对象(在浏览器中是`window`),在对象方法中,`this`指向调用该方法的对象。在函数调用中,`this`的确定较为复杂,需要根据调用方式(常规调用、apply/call方法、箭头函数等)来...

    细品javascript 寻址,闭包,对象模型和相关问题.docx

    在JavaScript中,变量的寻址遵循静态作用域规则。这意味着变量的作用域在编写代码时就已经确定,而不是在运行时根据调用上下文来决定。这一点与动态作用域的语言(如Perl)形成鲜明对比。 **示例代码分析:** ```...

    JavaScript 语言精粹

    此外,《JavaScript语言精粹》还会深入讨论作用域、变量提升、this关键字、事件处理、DOM操作以及异步编程,如回调函数、Promise和async/await。这些知识点对于前端开发人员来说至关重要,因为它们直接影响到网页的...

    js技术

    在学习JavaScript时,理解原型链、闭包、作用域以及this关键字的用法是必不可少的。同时,熟悉ES6及以后的新特性,如箭头函数、模板字符串、解构赋值、let和const等,能帮助开发者写出更简洁、高效的代码。 对于...

    Java Script 经典教程(七)——JavaScript用户指南

    - **作用域**:了解全局作用域和局部作用域,以及ES6的块级作用域。 3. **对象与数组** - **对象**:JavaScript中的对象是键值对的集合,通过花括号`{}`创建。属性访问可以用点号或方括号语法。 - **数组**:...

    javascript电子教程2

    同时,会深入讨论函数作用域,包括全局作用域、局部作用域以及闭包,这是JavaScript中高级特性的基础。 **第8部分:对象与数组** 这部分介绍了JavaScript的核心数据结构——对象和数组。对象是键值对的集合,可以...

    JavaScript对象模型-执行模型

    对于`let`和`const`声明,JavaScript引入了块级作用域,它们不会被提升。 此外,JavaScript是单线程的,但通过事件循环(Event Loop)和异步编程模型(如回调函数、Promise、async/await)来处理并发任务。事件循环...

    自学JavaScript基础语法笔记大全.rar

    1. 声明变量:使用`var`、`let`或`const`关键字,其中`let`和`const`是ES6新增的,它们具有块级作用域。 2. 数据类型转换:包括类型判断(`typeof`)和类型转换(如`Number()`、`String()`、`Boolean()`)。 二、...

Global site tag (gtag.js) - Google Analytics