首页 > 其他分享 >作用域

作用域

时间:2022-08-20 19:36:31浏览次数:46  
标签:console log 作用域 num var fn

变量提升

在代码执行之前,会先进行代码的预解析,将var和function声明的变量进行提升,提升为window的属性(全局变量),并将var声明的变量赋值为undefined,var的提升在function之前

console.log(num);
say();
var num = 100;
function say(){
	console.log('hello');
}

console.log(num);
say();

变量提升

var num;
function say(){
	consloe.log('hello');
}
console.log(num);//undefined 
say();//'hello'
num = 100;

console.log(num);//100
say();//'hello'

变量名一致时会进行覆盖

console.log(num);
var num = 100;
console.log(num);
function num(){
	console.log('20');
}
console.log(num);
var num = 50;
console.log(num);

变量提升

var num;
function num(){//覆盖原来的,此时num为一个函数
	console.log('20');
}
console.log(num);//f num(){	console.log('20');}
num = 100;
console.log(num);//100
console.log(num);//100
num = 50;
console.log(num);//50

全局作用域

全局作用域是最大的作用域,指向window对象,在全局作用域内声明的变量,在JS代码的时时处处都可以访问

  1. 全局作用域是最外围的一个执行环境,在web浏览器中,全局执行环境被认为是window对象。
  2. 所有全局变量和函数都是作为window对象的属性和方法创建的。
  3. 全局变量拥有全局作用域,在javascript代码中的任何地方都是有定义的。
  4. 全局作用域直到应用程序退出例如关闭网页或浏览器时才会被销毁
var num = 13;
function fn(){
	console.log(num);
}
fn();//打印13

局部作用域

特点:函数作用域中的所有代码执行完毕后,该作用域被销毁,保存在其中的所有变量和函数定义也随之销毁。

function test(){
    var message  = 'hi';
}
test();
alert(message); // 报错

作用域链

  1. 全局作用域变量包括:全局变量(直接声明在全局中不在任何函数体中)成为window的属性、不使用var声明而直接赋值的变量
  2. 全局作用域直到应用程序退出例如关闭网页或浏览器时才会被销毁
  3. 局部变量:函数参数、函数内使用var声明的变量
  4. 函数调用产生局部作用域,函数调用完毕局部作用域销毁,保存在其中的所有变量和函数定义也随之销毁
  5. 内部作用域可访问外部作用域、外部作用域不可访问内部
  6. 函数局部作用域有与全局同名的变量,函数内部访问时,优先访问内部的

this

非严格模式下:

  1. 全局作用域中,this 指向window
  2. 函数里的this 指向函数的调用者 找不到调用者 就指向window对象
  3. 构造函数里的this 指向构造函数创建的对象实例

严格模式下:

  1. 全局作用域中,this指向window对象(与非严格模式一样)
  2. 全局作用域中函数中的this,指向undefined
  3. 对象的函数中的this指向调用函数的对象实例(与非严格模式一样)
  4. 构造函数中的this指向构造函数创建的对象实例(与非严格模式一样)

对象

对象的this指向该对象

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

函数

函数的this指向调用者,对象调用指向对象,没有调用指向window

function fm() {
	console.log( this.a );
}
var obj = {
	a: 2,
	fn: fm
};
obj.fn(); //2
fn();//undefined

改变this指向

call

fn.call(obj, param1,...) 隐式帮我们调用函数
参数:
obj fn内部的this指向的对象
从第二个参数开始,都是传递给fn函数的实参

var a = 89;
var obj = { a: 999 };
function fn(a, b) {
	console.log(this.a);
	return a + b;
}
var res1 = fn(100, 300);
var res2 = fn.call(obj, 100, 300);
console.log(res1 == res2);

apply

fn.apply(obj, [param1,param2...]) 隐式帮我们调用函数
参数:
obj fn内部的this指向的对象
第二个参数是一个数组,数组的每一个元素都会被当作实参传递给fn

var a = 89;
var obj = { a: 999 };
function fn(a, b) {
	console.log(this.a);
	return a + b;
}
var res3 = fn.apply(obj, [100, 300]); // fn(100, 300)
console.log(res3); // 400

bind

fn.bind(obj, param1,...) 不会隐式帮我们调用函数 返回一个函数的引用地址
参数:
obj fn内部的this指向的对象
从第二个参数开始,都是传递给fn函数的实参
注意:如果想bind的同时调用函数 就要()在后面表示函数的调用

var a = 89;
var obj = { a: 999 };
function fn(a, b) {
	console.log(this.a);
	return a + b;
}
var res4 = fn.bind(obj, 100, 300);
console.log(res4()); // 400

var res5 = fn.bind(obj, 100, 300)();
console.log(res5); // 400

var res6 = fn.bind(obj)(100, 300);
console.log(res6); // 400

区别

执行

  • call/apply改变了函数的this上下文后马上执行该函数
  • bind则是返回改变了上下文后的函数,不执行该函数

返回值:

  • call/apply 返回fun的执行结果
  • bind返回fun的拷贝,并指定了fun的this指向,保存了fun的参数。

标签:console,log,作用域,num,var,fn
From: https://www.cnblogs.com/Kongqingzhi/p/16608456.html

相关文章

  • JS 作用域和作用域链
    js的作用域是让我们访问变量和函数的区域,作用域规定了如何查找变量;js有两种作用域:全局作用域,局部作用域;局部作用域又可分为函数作用域,块级作用域和其它具体的作用域......
  • js-数据类型-作用域-作用域链-变量 审核中
    变量变量声明的几种方式varletconst相同之处varletconst都可以用来声明一个变量都拥有函数作用域与全局作用域不同之处var声明的变量有变量提升而let......
  • ASP.NET Core :容器注入(二):生命周期作用域与对象释放
    //瞬时生命周期ServiceCollectionservices=newServiceCollection();services.AddTransient<TestServiceImpl>();using(ServiceProvidersp=services.BuildServic......
  • 13、名称空间与作用域
    13、名称空间与作用域 目录:一名称空间1.1内建名称空间1.2全局名称空间1.3局部名称空间二作用域2.1全局作用域与局部作用域2.2作用域与名......
  • Java变量与常量、作用域
    变量与常量、作用域1、变量(variable)变量:可以变化的量!Java是一种强类型语言,每个变量都必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作......
  • 作用域
    一、作用域作用域共有两种主要的工作模型:动态作用域、静态作用域词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里......
  • C语言中作用域
     001、 文件作用域:定义在函数外, 从定义开始到程序的结束均有效。 002、 块作用域:定义在程序块内,在程序块中起作用。 001、如果两个同名变量分别拥有文件作......
  • 09闭包与作用域
    1<!doctypehtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"6content="width=device-width,us......