>  기사  >  웹 프론트엔드  >  자바스크립트에서 변수를 선언하는 키워드는 무엇입니까?

자바스크립트에서 변수를 선언하는 키워드는 무엇입니까?

青灯夜游
青灯夜游원래의
2021-06-09 15:58:199819검색

JavaScript에서 변수를 선언하는 키워드는 var, let, const입니다. var로 선언된 변수는 모든 유형의 값을 저장하는 데 사용할 수 있습니다. 선언의 범위는 함수 범위입니다. const로 변수를 선언할 때 변수는 동일하게 초기화되어야 합니다. 시간이며, 초기화 후에는 값을 수정할 수 없습니다.

자바스크립트에서 변수를 선언하는 키워드는 무엇입니까?

이 튜토리얼의 운영 환경: Windows 7 시스템, ECMAScript 버전 6, Dell G3 컴퓨터.

변수 키워드 선언 var, let 및 const

ECMAScript 변수는 느슨한 형식입니다. 즉, 변수는 모든 유형의 데이터를 저장하는 데 사용할 수 있으며 각 변수는 값을 저장하는 데 사용되는 이름일 뿐입니다 자리 표시자 .

1.var 키워드

var로 선언된 변수는 any유형 값을 저장하는 데 사용할 수 있습니다(특수 값 undefine은 초기화 없이 저장됨). JavaScript는 변수를 정의하면서 변수에 값을 할당할 수도 있습니다. 변수는 할당된 값을 저장하는 변수로 정의됩니다. JavaScript는 변수가 초기화될 때 초기화되지 않습니다. 할당되는 것은 단순한 할당일 뿐입니다. 그러면 저장된 값뿐만 아니라 값의 유형도 변경할 수 있습니다. undefined),像其他语言一样在javascript在定义变量的同时还可以对变量进行赋值,该变量被定义为一个保存所赋值的值的变量,因为javascript是动态语言,在初始化变量的时候不会将它标识为所赋值的数据类型,只是一个简单的赋值而已。随后不仅可以改变保存的值,还可以改变值的类型:

var message = "hi";
	message = 100;

1.1.var声明作用域

    使用var操作符定义的变量会成为包含它的函数的局部变量。比如,使用var在函数内部定义一个变量,就意味这该变量将在函数退出时被销毁,我觉得这就是所说的垃圾回收

function test( ) {
		vart message = "hi";	//局部变量
	}
test( );
console.log(message);	//报错!

    函数调用之后变量会随机被销毁,因此最后一行会报错。不过,在函数定义变量时省略var操作符时可以创建一个全局变量

function test( )  {
	message = "hi";	//全局变量
}
test( );
console.log(message);	//"hi"

    只要调用一次函数test( )就会定义message这一全局变量,并且可以在函数外部访问。但是由于在局部作用域中定义的全局变量很难维护,所以一般不推荐这样做。

1.2.var声明提升

    使用var关键字声明的变量会自动提升函数作用域顶部,即所谓的“提升”(hoist),也就是把所有变量声明都拉到函数作用域的顶部:

function fool( ) {
	console.log(age);
	var age = 28;
}
fool( );	//undefined

    这里是不会报错的,而是显示undefined,ECMAScript在运行是会把它看成等价于如下的代码:

function fool( ) {
	var age;
	console.log(age);
	age = 28;
}
fool( );	//undefined

2.let声明

    let跟var的作用差不多,但有着非常重要的区别。最明显的区别是let声明的范围是块作用域,而var声明的范围是函数作用域:

if (true) {
	let age = 26;
	console.log(age);	//26
}
console.log(age);	//ReferceError:age没有定义

    age变量的作用域仅限于该块内部,所以不能在if块外部被引用。块作用域是函数作用域的子集,所以适用于var的作用域限制也同样适用于let。

    let也不允许同一块作用域中出现冗余声明(var可以):

var name;
var name;
let age;
let age;	//SyntaxError;标识符age已经声明过了

    此外,对声明冗余报错不会因混用var和let而受影响。这两个关键字声明的并不是不同类型的变量,他们只是指出变量在相关作用域如何存在。

2.1.暂时性死区

    let与var的另一个重要区别是let声明的变量不会在作用域中被提升

//name会提升
console.log(name);	//undefined
var name = 'matt';

//name不会提升
console.log(name);	//ReferenceError:name没有定义
let name = 'matt';

2.2.全局声明

    与var不同,使用let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量则会):

var name = 'matt';
console.log(window.name);	//'matt'

let name = 'matt';
console.log(window.name);	//undefined

    不过,let声明仍然是在全局作用域中发生的,相应变量会在页面的声明周期内存续。

2.3.条件声明

    let的作用域是块,所以不可能检查前面是否已经使用let声明过同名变量,同时也就不可能在没有声明的情况下声明它。使用try/catch或typeof操作符也不能解决,因为条件块中let声明的作用域仅限于该块。为此,对于let这个新的ES6声明关键字不能依赖条件声明模式。

2.4.for循环中的let声明

    在使用var的时候,最常见的问题就是对迭代变量的奇特声明和修改:

for(var i = 0; i < 5; ++i) {
	setTimeout( () => console.log(i) ,0)
}
//你可能以为会输出0、1、2、3、4
//实际上输出的是5、5、5、5、5

    在退出循环的时候迭代变量保存的是导致循环退出的值:5。在之后执行setTimeout

for(let i = 0; i < 5; ++i) {
	setTimeout( () => console.log(i) ,0)
}
//会输出0、1、2、3、4
1.1.var 선언 범위

🎜🎜🎜 다음을 사용하여 정의된 변수 var 연산자는 이를 포함하는 함수의 지역 변수가 됩니다. 예를 들어, 함수 내에서 변수를 정의하기 위해 var를 사용한다는 것은 함수가 종료될 때 변수가 파괴된다는 것을 의미합니다. 이것이 바로 가비지 수집이라고 생각합니다. 🎜
const person = { };
person.name = &#39;matt&#39;;
🎜 함수가 호출된 후 변수가 무작위로 파괴됩니다. 이므로 마지막 줄에서 오류가 보고됩니다. 하지만 함수에서 변수를 정의할 때 var 연산자를 생략하면 🎜전역 변수🎜를 생성할 수 있습니다. 🎜rrreee🎜 test() 함수가 한 번만 호출되면 전역 변수 메시지가 정의되고 외부에서 액세스할 수 있습니다. 기능. 그러나 로컬 범위에 정의된 전역 변수는 유지 관리가 어렵기 때문에 일반적으로 권장되지 않습니다. 🎜🎜🎜1.2. Var 선언 호이스팅🎜🎜🎜🎜 var 키워드를 사용하여 선언된 변수는 🎜함수 범위의 맨 위로🎜 자동으로 호이스팅됩니다. "호이스팅"(hoist)이라고 합니다. 즉, 모든 변수 선언이 함수 범위의 맨 위로 당겨집니다. 🎜rrreee🎜 이는 오류를 보고하지 않지만 ECMAScript에서는 이를 처리하도록 표시합니다. 다음 코드에서 실행 시 동일하게 사용됩니다. 🎜rrreee🎜🎜🎜2.let 선언🎜🎜🎜🎜 Let은 var와 유사한 기능을 갖고 있지만 매우 중요한 차이점이 있습니다. 가장 분명한 차이점은 let 선언의 범위는 🎜block 범위🎜인 반면 var 선언의 범위는 함수 범위입니다. 🎜rrreee🎜 age 변수의 범위는 블록 내부로 제한되므로 if 블록 외부에서는 참조할 수 없습니다. 블록 범위는 함수 범위의 하위 집합이므로 var에 적용되는 동일한 범위 제한이 let에도 적용됩니다. 🎜🎜 Let은 동일한 범위에서 중복 선언을 허용하지 않습니다(var 가능):🎜rrreee🎜 또한 중복 선언 오류는 var와 let을 혼합해도 영향을 받지 않습니다. 이 두 키워드는 서로 다른 유형의 변수를 선언하지 않으며 단지 관련 범위에 변수가 존재하는 방식을 나타냅니다. 🎜🎜🎜2.1. 임시 데드존 🎜🎜🎜🎜 let과 var의 또 다른 중요한 차이점은 let 🎜으로 선언된 변수가 범위 🎜에서 승격되지 않는다는 것입니다. 🎜🎜2.2. 전역 선언🎜🎜🎜🎜 var와 달리 전역 범위에서 let을 사용하여 선언된 변수는 창 개체의 속성이 되지 않습니다(var로 선언된 변수는 다음과 같습니다). 🎜rrreee🎜 그러나 let 선언은 여전히 ​​전역 범위에서 발생하며 해당 변수는 페이지 선언 주기 내에서 유지됩니다. 🎜🎜🎜2.3. 조건부 선언 🎜🎜🎜🎜 let의 범위는 블록이므로 이전에 다음을 사용하여 동일한 이름의 변수가 선언되었는지 확인할 수 없습니다. 선언하지 않고 선언하는 것도 불가능합니다. 조건부 블록의 let 선언 범위가 해당 블록으로 제한되기 때문에 try/catch 또는 typeof 연산자를 사용하면 이 문제를 해결할 수 없습니다. 이러한 이유로 새로운 ES6 선언 키워드 let은 조건부 선언 패턴에 의존할 수 없습니다. 🎜🎜🎜2.4. for 루프의 let 문 🎜🎜🎜🎜 var를 사용할 때 가장 일반적인 문제는 반복 변수의 이상한 선언과 수정입니다. 🎜rrreee 🎜 종료할 때 루프에서 반복 변수는 루프를 종료시킨 값을 저장합니다: 5. 나중에 setTimeout 시간 초과 논리가 실행될 때 i는 동일한 변수가 되므로 최종 출력은 동일한 값이 됩니다. 🎜

    使用let声明迭代变量时,JavaScript引擎在后台会为每个迭代循环声明一个新的迭代变量,每个setTimeout引用的都是不同的变量实例:

for(let i = 0; i < 5; ++i) {
	setTimeout( () => console.log(i) ,0)
}
//会输出0、1、2、3、4

【相关推荐:javascript学习教程

3.const声明

    const的行为与let基本相同,唯一一个重要区别是它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行错误。

    const声明的限制只适用于它指向的变量的引用。如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制:

const person = { };
person.name = &#39;matt&#39;;

4.使用建议

let和const是ES6中新增的,从客观上为JavaScript更精确地声明作用域和语义提供更好的支持。

4.1.不使用var

    限制自己只使用let和const有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值。

4.2.const优先,let次之

    使用const声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。因此,我们应该优先使用const来声明变量,只有在提前知道未来会有修改时再使用let。

更多编程相关知识,请访问:编程入门!!

위 내용은 자바스크립트에서 변수를 선언하는 키워드는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.