Javascript中的作用域和上下文深入理解

yizhihongxing

Javascript中的作用域和上下文深入理解

在理解Javascript中的作用域和上下文之前,需要先了解一些基本的概念。

作用域

作用域定义了变量和函数的可访问性。在Javascript中,作用域分为全局作用域和函数作用域。全局作用域是在整个程序中都可访问的作用域,而函数作用域只有在函数内部才能访问。

var关键字的作用域

使用var关键字声明的变量的作用域是函数作用域,而不是块级作用域。这意味着,在函数内部声明的变量只能在函数内部访问,而不会被外部代码访问到。

function example() {
  var x = 10;
  if (true) {
    var y = 20;
    console.log(x);
    console.log(y);
  }
  console.log(x);
  console.log(y);
}
example();
// Output:
// 10
// 20
// 10
// 20

在这个例子中,由于使用var声明变量x和y,它们的作用域都是example函数的作用域,因此我们可以在函数内的任何位置使用它们。

let和const关键字的作用域

使用let和const关键字声明的变量的作用域是块级作用域。这意味着,在if语句或循环语句内部声明的变量只能在该块级作用域内部访问,而不会被外部代码访问到。

function example() {
  let x = 10;
  if (true) {
    const y = 20;
    console.log(x);
    console.log(y);
  }
  console.log(x);
  console.log(y); // ReferenceError: y is not defined
}
example();
// Output:
// 10
// 20
// 10

在这个例子中,由于使用let和const声明变量x和y,它们的作用域都是if语句的块级作用域,因此我们只能在if语句内访问变量y,而不能在外部访问到它。

上下文

上下文表示代码执行时所处的环境。在Javascript中,上下文分为全局上下文和函数上下文。

全局上下文表示代码在全局作用域执行时的执行环境。

console.log(this); // Output: Window
console.log(window); // Output: Window

在全局作用域内执行代码时,上下文就是Window对象。此时的this指向的是全局对象Window。

函数上下文表示代码在函数作用域内执行时的执行环境。

function example() {
  console.log(this);
}
example(); // Output: Window

在函数作用域内执行代码时,上下文就是函数本身。此时的this指向的是全局对象Window。

改变上下文的方法

通过call、apply和bind方法可以临时改变this的指向。这些方法将函数的this指向指定的对象,可以用于调用某个函数时临时改变函数的上下文。

const person = {
  firstName: "John",
  lastName: "Doe"
};

function greeting() {
  console.log(`Hello, ${this.firstName} ${this.lastName}`);
}

greeting.call(person); // Output: Hello, John Doe

greeting.apply(person); // Output: Hello, John Doe

const newGreeting = greeting.bind(person);
newGreeting(); // Output: Hello, John Doe

以上代码中,我们定义了一个person对象和一个greeting函数。通过call、apply和bind方法,我们将greeting函数的上下文改变为person对象,从而在调用greeting函数时,可以访问person对象中的属性。

示例:

示例1

let i = "global scope";
function foo() {
  console.log(i);
  let i = "function scope";
  console.log(i);
}

foo();
console.log(i);
// Output:
// undefined
// function scope
// global scope

在这个例子中,我们在函数中使用了let关键字声明变量i,这实际上创建了一个新的变量,它的作用域是函数作用域。在函数中调用console.log(i)时,输出undefined,是因为变量i已经被声明,但还没有被赋值。在后面调用console.log(i)时,输出函数作用域中的变量i的值。最后,我们在全局作用域中访问变量i时,输出了全局作用域中变量i的值。

示例2

const person = {
  firstName: "John",
  lastName: "Doe",
  fullName: function () {
    console.log(this.firstName + " " + this.lastName);
  }
}

person.fullName(); // Output: John Doe

在这个例子中,我们定义了一个person对象和一个fullName方法。在fullName方法中,this始终指向当前的person对象。当我们调用person.fullName()时,输出了person对象中firstName和lastName属性的值,即输出了John Doe。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript中的作用域和上下文深入理解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • jquery 时间戳转日期过程详解

    下面是详细讲解“jquery 时间戳转日期过程详解”的完整攻略。 1. 背景 在前端开发中,我们经常需要将时间戳转换成可读性较好的日期。很多人使用 JavaScript 的内置函数进行转换,但很多开发者更愿意使用 jQuery 来完成这一任务,因为它更加简单并且易于操作。本文将详细介绍如何使用 jQuery 将时间戳转换成日期。 2. 前置知识 在本文中,我…

    JavaScript 2023年5月27日
    00
  • JavaScript无提示关闭窗口(兼容IE/Firefox/Chrome)

    下面是“JavaScript无提示关闭窗口(兼容IE/Firefox/Chrome)”的完整攻略: 标题 JavaScript无提示关闭窗口(兼容IE/Firefox/Chrome) 问题描述 在网页开发中,有时需要关闭当前页面而不触发提示框的弹出,那么如何使用JavaScript实现无提示关闭浏览器窗口的功能呢? 解决方案 通过JavaScript可以调用…

    JavaScript 2023年6月10日
    00
  • AngularJS实现的base64编码与解码功能示例

    AngularJS是一个流行的JavaScript框架,支持对前端数据进行处理和操作。Base64编码是一种将二进制数据转换成ASCII字符串的编码方式,它经常在各种场景中使用,比如网络传输、图片上传和加密等等。在AngularJS中实现Base64编码与解码功能非常简单,下面我将为大家详细介绍如何实现。 一、安装AngularJS 首先我们需要在项目中引入…

    JavaScript 2023年5月19日
    00
  • Javascript & DHTML DOM基础和基本API第5/5页

    《Javascript & DHTML DOM基础和基本API》是一本介绍JavaScript和DHTML的书籍,其中包含了JavaScript和DHTML DOM的基础和API,本攻略将对第5/5页进行详细解读。 1. 什么是DOM? DOM(Document Object Model)是HTML和XML文档的编程接口,它将整个页面抽象成一个树状结…

    JavaScript 2023年6月10日
    00
  • javascript字符串替换及字符串分割示例代码

    下面就是关于“javascript字符串替换及字符串分割”的完整攻略。 JavaScript 字符串替换 在 JavaScript 中,可以使用 replace() 方法实现字符串替换功能。该方法接收两个参数,第一个参数是要替换的字符串或正则表达式,第二个参数是新的字符串。 下面是一个简单的示例,代码如下: let str = "hello Jav…

    JavaScript 2023年5月28日
    00
  • Egg Vue SSR 服务端渲染数据请求与asyncData

    Egg Vue SSR 是一个基于 Egg.js 和 Vue.js 的服务端渲染项 目,它能够将 Vue.js 组件在服务端渲染完成之后再返回给客户端,在一定程度上可以提高页面的首屏渲染速度和搜索引擎的爬取效果。为了更好的支持服务端渲染,Egg Vue SSR 提供了异步数据请求方法 asyncData。 asyncData 是在服务端执行的方法,而非在浏览…

    JavaScript 2023年6月11日
    00
  • JavaScript防抖与节流超详细全面讲解

    JavaScript防抖与节流超详细全面讲解 一、什么是防抖与节流 防抖(debouncing)和节流(throttling)解决的是高频触发事件的性能问题。事件被触发多次,但是实际上我们只需要在事件停止触发之后才进行一次处理,或者减少事件的触发次数。 防抖是指在短时间内多次触发同一个事件,只执行最后一次,或者只在连续触发事件后停止一段时间后再执行。比如在输…

    JavaScript 2023年6月10日
    00
  • 微信小程序保持session会话的方法

    下面我将为你详细介绍微信小程序保持 session 会话的方法。 什么是 session session 是指客户端和服务器之间的交互状态,可以理解为身份验证或登录状态的一种维持方式。常见的维持 session 的方法有 cookie 和 token。 微信小程序 session 微信小程序中,可以通过 wx.request 方法向服务器发送请求并维持 se…

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