有关js的变量作用域和this指针的讨论

yizhihongxing

标题:有关JS的变量作用域和this指针的讨论

1. 变量作用域

1.1 作用域是什么

在JS中,作用域可以理解为变量的有效范围。JS支持两种作用域:全局作用域和函数作用域。

全局作用域是指整个JS文件,其内定义的变量可以被文件中任何一个函数所使用。

函数作用域是指只在函数体内部(包括函数体内嵌套的函数中)定义的变量。这些变量只在函数体内及其内部的函数中有效。

1.2 变量声明提前

在JS中,变量可以在使用前先声明。这是因为JS中存在变量声明提前的机制,即JS在运行时会将函数中声明的变量提前至函数的顶部。

示例代码:

function test(){
  console.log(a); // undefined
  var a = 10;
  console.log(a); // 10
}
test();

1.3 块级作用域

在ES6中,引入了块级作用域。块级作用域是指if、for、while等语句的{}内(即花括号内)定义的变量,在语句外部无法访问,但在语句内部可以。

示例代码:

var a = 10;

if(true){
  var a = 20;
  let b = 30;
}
console.log(a); // 20
console.log(b); // Uncaught ReferenceError: b is not defined

2. this指针

2.1 this是什么

在JS中,this指针用于引用当前正在执行的函数所属的对象。this指针的实际指向是在函数被调用时确定的。

2.2 函数调用方式对this的影响

函数的调用方式有以下几种:

  1. 作为普通函数调用

当函数作为普通函数来调用时,this指向全局对象。在浏览器环境下,全局对象就是window对象;在Node.js环境下,全局对象就是global对象。

javascript
function test(){
console.log(this);
}
test(); // window

  1. 作为对象方法调用

当函数作为对象方法来调用时,this指向调用该方法的对象。

javascript
var obj = {
name: 'Tom',
sayName: function(){
console.log(this.name);
}
};
obj.sayName(); // "Tom"

  1. 作为构造函数调用

当函数作为构造函数来调用时,this指向新创建的对象。

javascript
function Person(name){
this.name = name;
}
var p = new Person('Tom');
console.log(p.name); // "Tom"

  1. 使用apply、call或bind方法调用

当使用apply、call或bind方法来调用函数时,this指向调用该方法时传入的第一个参数。

javascript
var obj1 = {
name: 'Tom'
};
var obj2 = {
name: 'Jerry'
};
function test(){
console.log(this.name);
}
test.apply(obj1); // "Tom"
test.call(obj2); // "Jerry"
var f = test.bind(obj1);
f(); // "Tom"

2.3 箭头函数中的this

在箭头函数中,this指向的是包含箭头函数的函数的this指针,而不是箭头函数自己的this指针。

示例代码:

var obj = {
  name: 'Tom',
  sayName: function(){
    var func = ()=>console.log(this.name);
    func();
  }
};
obj.sayName(); // "Tom"

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:有关js的变量作用域和this指针的讨论 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript实现动态添加、移除元素或属性的方法分析

    JavaScript实现动态添加、移除元素或属性的方法分析 动态添加元素 方法一:createElement()方法 我们可以使用createElement()方法来创建一个新的元素节点,然后将该节点添加到文档中的某个元素中作为其子元素。其基本语法为: document.createElement(tagName) 其中,tagName指定新节点的标签名称,…

    JavaScript 2023年6月10日
    00
  • JavaScript基础之立即执行函数

    JavaScript基础之立即执行函数 在JavaScript中,立即执行函数(Immediately Invoked Function Expression,IIFE)是一个非常重要的概念。本文将详细介绍什么是立即执行函数以及如何使用它。 什么是立即执行函数 立即执行函数是指在定义后立即执行的函数。它的形式如下: (function() { // 函数体 …

    JavaScript 2023年5月27日
    00
  • Javascript模块导入导出详解

    下面是Javascript模块导入导出详解的完整攻略。 什么是Javascript模块 Javascript模块是Javascript中的一种代码组织方式,它将代码分割成更小的、更易于维护的模块,每个模块都有自己的作用域和功能。模块可以包含变量、函数、类等,通过模块的方式来导入和导出这些内容,可以实现模块化开发的效果。 模块的导出 Javascript模块的…

    JavaScript 2023年5月27日
    00
  • php与javascript正则匹配中文的方法分析

    关于“php与javascript正则匹配中文的方法分析”,我为您提供以下攻略。 1. 什么是正则表达式? 正则表达式是一种用来描述字符串模式的方法。它可以在文本中找到特定的字符、单词或模式,并根据需要对它们进行操作。正则表达式常用于搜索、替换和验证文本数据。 2. 中文匹配的基本语法 在正则表达式中,中文是通过Unicode码来表示的。要匹配中文,我们需要…

    JavaScript 2023年5月19日
    00
  • 实现javascript的延期执行或者重复执行的两个函数

    实现 JavaScript 的延期执行或重复执行,常用两个函数:setTimeout 和 setInterval。以下是详细攻略: setTimeout setTimeout 函数可以延迟指定时间后执行一次函数。 该函数的第一个参数是要执行的函数或要执行的代码,第二个参数是需要延迟的时间,单位是毫秒。 setTimeout 函数返回一个 ID,我们可以通过该…

    JavaScript 2023年6月10日
    00
  • JS面向对象的程序设计相关知识小结

    下面是“JS面向对象的程序设计相关知识小结”的详细讲解。 1. Javascript面向对象基础 1.1 对象 在Javascript中,对象是由属性和方法组成的实例。属性可以是一个值、一个函数或一个对象。一个对象的属性也可以是另一个对象。方法是指对象可以执行的函数。 对象的创建可以使用字面量语法、构造函数或Object.create()方法。例如: // …

    JavaScript 2023年5月27日
    00
  • Javascript Boolean toString 方法

    以下是关于JavaScript Boolean对象的toString()方法的完整攻略。 JavaScript Boolean对象的toString()方法 JavaScript Boolean对象的toString()方法将Boolean对象转换为字符串。该方法接受一个参数,用于指定输出字符串基数(进制数),默认为10。 下面是一个使用Boolean对象的…

    JavaScript 2023年5月11日
    00
  • 用户注册常用javascript代码

    下面是详细讲解“用户注册常用JavaScript代码”的攻略。 JavaScript代码说明 在用户注册界面,常用的JavaScript代码包括表单验证、密码强度检查和数据存储。 表单验证 表单验证是用户注册中必不可少的一部分,其目的是避免用户输入无效、错误或不想要的信息。常用的表单验证方法有以下几种: required属性:该属性用于添加必填项标记。 正则…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部