js语法基础:var、let、function

717 阅读4分钟

概念及部分选题参考mdn文档

var

概念介绍

  • 1、变量声明,无论发生在何处,都在执行任何代码之前进行处理。
  • 2、用 var 声明的变量的作用域是它当前的执行上下文,它可以是嵌套的函数,或者对于声明在任何函数外的变量来说是全局。
  • 3、如果你重新声明一个 JavaScript 变量,它将不会丢失其值。
  • 4、当赋值给未声明的变量, 则执行赋值后, 该变量会被隐式地创建为全局变量(它将成为全局对象的属性)。

例题

// 第一句
// console.log(a)
// var a = a
// 第二句
// function x() {
//     y = 1 // 第四句
//     var z = 2
// }
// x()
// console.log(y)
// console.log(z)
// 第三句
// var a = 1
// var a
// console.log(a)
// 第四句(函数只有在执行时才解析,此处以后有机会再讲)
// console.log(z)
// function fn() {
//     z = 1
// }
// fn()
// 测试1
// var x = y, y = 'A'
// console.log(x + y)
// 测试2
// var x = 0
// console.log(typeof z)
// function a() {
//     var y = 2
//     console.log(x, y)
//     function b() {
//        x = 3
//        y = 4
//        z = 5
//     }
//     b()
//     console.log(x, y, z)
// }
// a()
// console.log(x, z)
// console.log(typeof y)

let

概念介绍

  • 1、let允许你声明一个作用域被限制在 块级中的变量、语句或者表达式。与 var 关键字不同的是, var声明的变量只能是全局或者整个函数块的。
  • 2、var 和 let 的不同之处在于后者是在编译时才初始化(暂存死区)。
  • 3、let不会在全局声明时(在最顶部的范围)创建window 对象的属性。
  • 4、在同一个函数或块作用域中重复声明同一个变量会引起SyntaxError。

例题

// 第一句
// function varTest() {
//     var x = 1
//     {
//        var x = 2
//        console.log(x)
//     }
//     console.log(x)
// }
// varTest()
// function letTest() {
//     let x = 1
//     {
//        let x = 2
//        console.log(x)
//     }
//     console.log(x)
// }
// letTest()
// 第二句
// function do_something() {
//     console.log(bar)
//     console.log(foo) // console.log(typeof foo)
//     var bar = 1
//     let foo = 2
// }
// do_something()
// 第三句
// var x = 'global'
// let y = 'global'
// console.log(this.x)
// console.log(this.y)
// 第四句(在 switch 语句中只有一个块)
// let x = 1
// switch(x) {
//     case 0:
//        let foo;
//        break;
//     case 1:
//        let foo;
//        break;
// }
// 测试1
// function test(){
//     var foo = 33
//     if (foo) {
//        let foo = (foo + 55)
//     }
//     console.log(foo)
// }
// test()
// 测试2
// var a = 1
// var b = 2
// if (a === 1) {
//     var a = 11
//     let b = 22
//     console.log(a)
//     console.log(b)
// }
// console.log(a)
// console.log(b)
// 测试3
// let x = 1
// {
//     var x = 2
// }
// console.log(x)

const

概念介绍

  • 1、大部分特性和let一致。
  • 2、const声明创建一个值的只读引用(所以创建时必须初始化)。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。例如,在引用内容是对象的情况下,这意味着可以改变对象的内容(例如,其参数)。

例题

// 第二句
// const FOO
// const number = 1
// number++
// 关于引用对象,暂时稍微讲解一下,以后有机会再详细讲解
// const obj = { 'key': 'value' }
// obj.key = 'otherValue'

function

概念介绍

  • 1、一个被函数声明创建的函数是一个 Function 对象,具有 Function 对象的所有属性、方法和行为。(Function具体内容请查看官方文档)
  • 2、函数也可以被表达式创建。
  • 3、函数可以被有条件来声明,这意味着,在一个 if 语句里,函数声明是可以嵌套的。有的浏览器会将这种有条件的声明看成是无条件的声明,无论这里的条件是true还是false,浏览器都会创建函数。因此,它们不应该被使用。
  • 4、默认情况下,函数是返回 undefined 的。想要返回一个其他的值,函数必须通过一个 return 语句指定返回值。

例题

// 第一句(部分)
// 函数参数为传参的引用、函数声明和函数定义会提升(函数表达式不会)
// hoisted()
// function hoisted() {
//     console.log("foo")
// }
// var hoisted
// hoisted = function() {
//     console.log("foo")
// }
// hoisted()
// 第二句
// const fn = function() {}
// 第三句 判断语句是true还是false,都一样
// var hoisted = "foo" in this
// console.log(`'foo' name ${hoisted ? "is" : "is not"} hoisted. typeof foo is ${typeof foo}`)
// if (false) {
//     function foo(){ return 1 }
// }
// 在Chrome、Firefox里:
// 'foo' 变量名被提升,但是 typeof foo 为 undefined
// 在Safari里:
// 'foo' 变量名被提升. 而且 typeof foo 为 function
// 在Edge里:
// 'foo' 变量名未被提升. 而且 typeof foo 为 undefined
// 测试1
// const obj = { 'key': 'value' }
// function fn1(obj) {
//     obj.key = 'newValue'
// }
// fn1()
// console.log(obj)
// 测试2
// 猜测function中的参数声明是var、let还是const
// var a = 1
// function fn(a = a) {
//     console.log(a)
// }
// fn()
// 测试3
// 思考try catch中的参数属于什么

综合测试

// 综合测试1
// console.log(test1)
// test1 = 'test2'
// var test1
// function test1() {}
// console.log(test1)
// 综合测试2
// var obj1 = obj2 = { 'key': 0 }
// function fn(obj) {
//     obj.key++
//     {
//        obj = { 'key': 2 }
//     }
//     obj.key++
//     obj2 = obj
// }
// fn(obj1)
// console.log(obj1, obj2)
// 综合测试3
// function f1() {
//     console.log(num)
// }
// function f2() {
//     var num = 2
//     console.log(num)
//     f1()
// }
// let num = 1
// f2()
// 综合测试4
// function fn() {
//     // console.log(a)
//     let a = 1 // 思考let改成var后打印结果有什么区别
//     {
//        console.log(a)
//        a = 2
//        console.log(a)
//        function a() {}
//        console.log(a)
//        a = 3
//        console.log(a)
//     }
//     console.log(a)
// }
// fn()