JS -- 作用域问题

JS – 作用域问题

JS – 作用域问题

Table of Contents

  • 变量声明和函数声明
function f() {
    a = 3;                      // 相当于 window.a = 3
}
f();
alert(a);                       // 3

function f() {
    var a = 3;
}
f();
alert(a);                       // 未定义
var t = 10;
function f() {
    t = 3;
}
document.write(t); // 3
var t = 10;
function f() {
    var t = 3;
}
document.write(t); // 10
var a = 3;
function f1() {
    a = 4;
    function f2() {
        a = 5;
    }
    f2();
}

f1();
document.write(a);      // 5
var a = 3;
function f1() {
    var a = 4;
    function f2() {
        a = 5;
    }
    f2();
}
f1();
document.write(a);      // 3

变量声明和函数声明

对于声明的分析过程: 参数 –> 变量 –> 函数声明

规则 1:
对于变量声明
如果 存在参数 和 声明变量名相同, 不能覆盖 (不会重新声明一个变量), 但是有赋值会覆盖, 另外说, 规则 1 和规则 2 只讨论变量声明

规则 2:
对于函数声明
函数声明可以覆盖变量声明 和 参数

// -- 对于规则 1
function f(a) {
    var a;                      // 这里不会声明
    alert(a);                   // 8
}
f(8);

function f(a) {
    var a = 2;
    alert(a);                   // 2
}
f(3);
// -- 对于规则 2
function f() {
    var a;
    alert(a);

    function a() {}
    alert(a);
}
f();                            // 输出两个 a 函数, 说明原来的 a 声明被函数声明覆盖

function f() {
    var a = ‘hello‘;            // 最后赋值, 函数 a 会被覆盖成 ‘hello‘, 赋值的分析 是在 变量声明和函数声明 分析之后的
    alert(a);

    function a() {}
    alert(a);
}
f();                            // 输出两个 ‘hello‘

function a(b) {
    alert(b);                   // 先赋值 1
    b = function () {           // 没有函数声明, 直接赋值, 再赋值一个函数
        alert(b);
    }
    b();
}
a(1);                           // 结果是 1 和一个函数
时间: 2024-10-15 14:11:08

JS -- 作用域问题的相关文章

关于js作用域

我们知道在编程语言中,作用域的作用就是控制变量.参数的可见范围和生命周期. js中提供了函数作用域的功效,比如在函数中定义的变量外部是无法访问到的: function jsFunc(){ var a = 5; } alert(a); // undefined 但是js中却没有提供块作用域的功效,比如我们在java代码中如果些如下代码: public static Boolean b = false; public static void main(String[] args) { if(!b){

js作用域理解 function(){} var

在coding过程中遇到过下面的情况: 1 var test1 = function(){ 2 var c=4; 3 test2(); 4 }; 5 6 var test2 = function(){ 7 console.log(c); 8 }; 9 10 test1(); 思考一下,7行会conasole出什么?4 吗?实际上却是 c is not defined. 而当代码如下的时候, 1 var test1 = function(){ 2 var c=4 3 var test2 = fun

js作用域的几个问题

按照<权威指南>的说法,全局的变量作用域是全局性的,在js代码中,他处处都有定义.而在函数之内声明的变量,就只有在函数体内有定义了.函数的参数也是局部变量,他们只在函数体内部有定义.在函数体内部,局部变量的优先级比同名的全局变量高.如果给一个局部变量或函数的参数声明的名字与全局变量的名字相同,那么就有效地隐藏了这个全局变量. js没有块级作用域,,函数中声明的所有变量,无论在哪里,如for ,if等,在整个函数中他们都是有定义的.这个也叫变量提升,作用域都是在函数中. 1,对象内部的作用 ?

JS作用域链

Js作用域与执行环境: 1. 作用域链: <1>用途:保证对执行环境有权访问的所有变量和函数的有序访问. <2>构成: a.作用域链的前端,始终都是当前执行代码所在环境的变量对象(如果这个环境是函数,则将其活动对象作为变量对象,活动对象在最开始时只包含一个变量,即arguments对象): b.下一个变量对象来自包含(外部)环境: c.最后一个对象,为全局执行环境的变量对象. <3>标识符解析:是沿着作用域链一级一级地搜索标识符的过程,始终从作用域链的前端开始,然后逐级

JS作用域面试题总结

关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~ 1.js作用域(全局变量,局部变量)内部可以访问外部,但外部的不能访问内部的(局域变量) var a=10; function aaa(){ alert(a); }; aaa(); //a 为外部变量即全局变量,所以可以直接访问到 结果为10 function aaa(){ var a=10; }; aaa(); alert(a);

基础知识回顾——js作用域

1.对js作用域的理解. 作用域 作用域分为全局作用域和函数作用域,我们可以理解为变量的生存环境(空间).全局作用域包含函数作用域,函数作用域里的变量可以访问到全局作用域中的变量,但是反之则不行. 变量提升 在js作用域中还有变量提升的现象(只有var 声明的变量才会有变量提升,window声明的不会),赋值语句最后生效.当我定义一个变量,如果它没有被赋值,它是属于undefined: 变量提升的优先级 函数声明 > 函数形参(函数的形参属于函数作用域:) > 自定义变量 延长作用域,闭包(r

闲话js作用域

js词法环境包括环境变量绑定及外部引用'函数创建的时候有个内部属性[[scope]],它指向当前函数的词法环境对象.而词法环境的外部引用一个词法环境'直到全局词法环境'它外部引用为null'这样就构成作用域链.当进入可执行代码时'会创建执行环境'执行环境包括词法环境变量环境及this关键字绑定'如果是函数'它还会创建一个新的词法环境对象添加到当前作用域链前端'此为活动对象'活动对象的外部引用为此前的最上层执行环境' 闲话js作用域

easyui datagrid load 封装 参数问题 js 作用域

var temp = { LoginAccount: $('#LoginAccount').val(), ShopName: $('#ShopName').val() }; function doSearch1() { $('#datagrid').datagrid('load', temp); } function doSearch2() { $('#datagrid').datagrid('load', { LoginAccount: $('#LoginAccount').val(), Sh

js作用域零碎的知识点,不同的script块,虽然同是全局变量

如下代码,第一次弹出a,因为解析器里找到var a,赋予a变量undefined,弹出undefined 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>js作用域</title> 6 <script type="text/javascript"> 7 alert(a); //第一次弹出a为u

JS(作用域)_关于作用域的注意点

一.前言 最近复习的时候总算是把以前作用域涉及到的模糊的概念弄得差不多了. 以下是几个关于js作用域中重要的概念 二.主要知识 1.Js因为 JavaScript 采用的是静态作用域,函数的作用域在函数定义的时候就决定了. 举例: 1 var value = 1; 2 3 function foo() { 4 console.log(value); 5 } 6 7 function bar() { 8 var value = 2; 9 foo(); 10 } 11 12 bar();//1 /*