首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

全局Array.length在函数内部具有值,但在函数外部为0,但仍具有相同的对象

这个问题涉及到JavaScript中的作用域和变量提升的概念。

在JavaScript中,全局作用域是指在整个代码中都可以访问的作用域。而函数内部也有自己的作用域,称为局部作用域或函数作用域。

当在全局作用域中声明一个数组,并给它赋值后,该数组的length属性会被设置为数组中元素的个数。例如:

代码语言:txt
复制
var myArray = [1, 2, 3];
console.log(myArray.length); // 输出 3

然而,当在函数内部访问这个全局数组时,由于JavaScript中的变量提升机制,函数内部会创建一个名为myArray的局部变量,并且该变量会被提升到函数的顶部。但是,由于在函数内部并没有重新赋值给myArray,所以它仍然引用全局作用域中的那个数组。但是,由于函数内部的作用域不会影响全局作用域中的数组的length属性,所以在函数内部访问myArray.length时,它仍然是全局数组的长度。例如:

代码语言:txt
复制
var myArray = [1, 2, 3];

function myFunction() {
  console.log(myArray.length); // 输出 3
}

myFunction();

然而,在函数外部访问myArray.length时,由于全局作用域中并没有声明名为myArray的变量,所以它的值为0。例如:

代码语言:txt
复制
var myArray = [1, 2, 3];

function myFunction() {
  console.log(myArray.length); // 输出 3
}

myFunction();

console.log(myArray.length); // 输出 0

综上所述,全局Array.length在函数内部具有值,但在函数外部为0,但仍具有相同的对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

针对高级前端的8个级JavaScript面试问题

所有这些声明都发生在全局作用域中。在bar()函数内部,声明了一个变量a并赋值为 3。那么当bar()函数被调用时,你认为会输出哪个值的a?...当JavaScript引擎执行这段代码时,全局变量a被声明并赋值为5。然后调用了bar()函数。在bar()函数内部,声明了一个局部变量a并赋值为3。这个局部变量a与全局变量a是不同的。...[]) // "boolean" 对于 [],它是一个对象,这是可以理解的,因为在JavaScript中,包括数组和函数在内的一切都是对象。但操作数 ![] 是如何具有布尔类型的呢?...因此,我们需要将空字符串 "" 转换为数字,这给了我们一个 0。 "" == 0 ToNumber("") == 0 0 == 0 最后,两个操作数具有相同的类型和条件1成立。...由于两者具有相同的值,最终的输出是: 0 == 0 // true 至此,我们已经利用了强制转换(coercion)来解决了我们探讨的最后几个问题,这是掌握JavaScript和解决面试中这类常见问题的重要概念

21830

针对高级前端的8个级JavaScript面试问题

所有这些声明都发生在全局作用域中。在bar()函数内部,声明了一个变量a并赋值为 3。那么当bar()函数被调用时,你认为会输出哪个值的a?...当JavaScript引擎执行这段代码时,全局变量a被声明并赋值为5。然后调用了bar()函数。在bar()函数内部,声明了一个局部变量a并赋值为3。这个局部变量a与全局变量a是不同的。...[]) // "boolean" 对于 [],它是一个对象,这是可以理解的,因为在JavaScript中,包括数组和函数在内的一切都是对象。但操作数 ![] 是如何具有布尔类型的呢?...因此,我们需要将空字符串 "" 转换为数字,这给了我们一个 0。 "" == 0 ToNumber("") == 0 0 == 0 最后,两个操作数具有相同的类型和条件1成立。...由于两者具有相同的值,最终的输出是: 0 == 0 // true 至此,我们已经利用了强制转换(coercion)来解决了我们探讨的最后几个问题,这是掌握JavaScript和解决面试中这类常见问题的重要概念

18710
  • 细数 JavaScript 实用黑科技(二)

    可以把任何类型的值转换为布尔值,并且只有当这个变量的值为 0 / null / "" / NaN / undefined 的时候才会返回 false,其他情况都返回 true。 !!''...但这个对象并不具有数组的全部方法,如 sort(), reduce(), map(), filter() var arrayElements = [].slice.call( elements );...x 是在函数 f 的外部声明的,所以它的作用域绑定外层,内部变量 a 不会到函数 f 体内取值,所以输出 1,而不是 2。...当我们在 foo 外部取出 bar 执行时,变量 x 指向的是 foo 内部的 x,而不是 foo 外部的 x。正是这种机制,构成了 “闭包” 现象。...IIFE 的目的有两个: 一是不必为函数命名,避免了污染全局变量; 二是 IIFE 内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。

    47240

    分享 8 个关于高级前端的 JavaScript 面试题

    所有这些声明都发生在全局范围内。在 bar() 函数内部,声明了一个变量 a 并赋值为 3。那么当调用 thebar() 函数时,你认为它会打印 a 的值是多少?...当 JavaScript 引擎执行此代码时,声明全局变量 a 并为其赋值 5。然后,调用 bar() 函数。在 bar() 函数内部,声明了一个局部变量 a 并赋值为 3。...该局部变量 a 与全局变量 a 不同。之后,从 bar() 函数内部调用 foo() 函数。 在 foo() 函数内部,console.log(a) 语句尝试记录 a 的值。...词法范围不是由我们调用函数的位置决定的。 这样做的结果是输出始终相同:在全局范围内找到的 a 值,在本例中为 5。...由于两者具有相同的值,因此,最终输出为: 0 == 0 // true 到目前为止,我们在探索的最后几个问题中使用了强制转换,这是掌握 JavaScript 和在面试中解决此类问题的重要概念,这些问题往往会被问到很多

    55830

    JavaScript(八)

    但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,直至作为作用域链终点的全局执行环境。...无论什么时候在函数中访问一个变量时,就会从作用域链中搜索具有相应名字的变量。一般来讲,当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象)。...但是,闭包的情况又有所不同。 在另一个函数内部定义的函数会将包含函数(即外部函数)的活动对象添加到它的作用域链中。...表面上看,似乎每个函数都应该返自己的索引值,即位置 0 的函数返回 0,位置 1 的函数返回 1,以此类推。但实际上,每个函数都返回 10。...内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。

    22820

    细说js变量、作用域和垃圾回收

    这是一个容易困惑的点 。ECMAScript 中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。...但接下来再访问 person.name 时仍然显示 ‘Fly_001’,这说明即使在函数内部修改了参数的值,但原始的引用仍保持不变。...其中,内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。 这些环境之间的联系是线性的、有次序的。...在函数内部,最接近的环境就是函数的局部环境,若初始化变量时没有使用 var 声明,该变量会自动被添加到全局环境。...,但在函数外部是访问不到的。

    59120

    说说js变量、作用域和垃圾回收

    这是一个容易困惑的点 。ECMAScript 中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。...但接下来再访问 person.name 时仍然显示 ‘Fly_001’,这说明即使在函数内部修改了参数的值,但原始的引用仍保持不变。...其中,内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。 这些环境之间的联系是线性的、有次序的。...在函数内部,最接近的环境就是函数的局部环境,若初始化变量时没有使用 var 声明,该变量会自动被添加到全局环境。...,但在函数外部是访问不到的。

    57530

    JavaScript进阶知识点——函数和对象详解

    return; } 2.赋值构造 //相当于function为匿名函数,然后匿名函数所得出的值返回给name,因而name可以调用function函数 var name = function...){ var x=1; x=x+2; } 内部函数可以使用外部函数的成员,但外部函数不能使用内部函数的成员 function test3(){ var x=1;...全局变量常常带有window前缀,但默认带有,所以不需要书写 window属于JavaScript下的一个对象,window之下包含我们所定义的全局变量以及各种函数方法 function test6()...console.log(window.x); //下面所使用的alert和window.alert具有相同代码相同作用 alert(x);...: 我们假设全大写字母的变量为常量 但实际上是可以修改的 //我们定义PI var PI = 3.14; //但我们仍旧可以修改 PI = 3.33; 但在JavaScript的ES6中,提供了const

    39310

    重学JavaScript之匿名函数

    但在接下来调用 a() 时,由于必须执行 f(),但 f 已经不是函数,所有就会报错。...但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部活动对象处于第三位。直到作为作用域链重点的全局执行环境。 在函数执行过程中,为读取和写入变量的值,就需要在作用域链中查找变量。...无论什么时候函数在访问一个变量时,就会从作用域链中搜索具有相同名字的变量,函数执行完成后,局部活动对象将被销毁,内存中仅保存全局作用域。...内部函数在外部函数中被返回后,它的作用域链被初始化为包含外部函数的活动对象和全局变量对象,这样内部函数就可以访问外部函数中定义的所有的变量。...在函数内部如果有私有变量,那么在函数内部可以访问这个变量,但在函数外部则不能访问它们。如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量。

    1.8K20

    面试官问我:什么是JavaScript闭包,我该如何回答?

    我个人认为,理解闭包的关键在于:外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象,这就是闭包的重要概念。...当arrFunc执行完毕后,其作用域被销毁,但它的变量对象仍保存在内存中,得以被匿名访问,这时i的值为10。...这时最内部的匿名函数访问的是num的值,所以数组中10个匿名函数的返回值就是1-10。...如果想使this指向外部函数的执行环境,可以这样改写: 在闭包中,arguments与this也有相同的问题。...函数内部的定时器 当函数内部的定时器引用了外部函数的变量对象时,该变量对象不会被销毁。 闭包的应用 应用闭包的主要场合是:设计私有的方法和变量。

    45310

    Go 切片使用绕坑指南

    大家都知道切片是指向底层数组的指针,切片本身不存储任何数据。这意味着即使在这里按值传递切片,函数中的切片仍指向相同的内存地址。...所以在 reverse()内部使用的切片是一个不同的指针对象,但仍将指向相同的内存地址,共享相同的数组。...所以在函数调用之后,该数组中的数字重新排列,函数外部的切片与内部的切片共享着相同的底层数组,所以外部的 s 表现出来的就是它也被排序了。...新切片具有新的“长度”属性,该属性不是指针,但仍指向同一数组。因此,我们函数内的代码最终会反转原始切片所引用的数组,但是原始切片的长度属性还是之前的长度值,这就是造成了上面 1被丢掉的原因。...同样,你应始终意识到,内部带有指针的结构很容易陷入相同的情况。除非指针本身被更新为引用内存中的另一个对象,否则指针内部数据的任何更改都将被保留。

    1.2K20

    申明与定义的区别

    c或者.cpp文件); (3)类型的定义应该放在头文件,因为类型不具有外部连接性,不同源文件拥有相同的类型定义不会报编译错误,但头文件不能重复包含。...typedef int int32; 注意,类型的作用域是源文件,即类型不具有外部连接性质,因此可以在不同源文件定义相同名称的类型,比如定义同名的类是不会报重定义错误的,这也说明了类型的定义应该放在头文件中...,但在同一个源文件定义相同名称的类型则编译器会报重定义错误。...虽然说是定义类型,但还是将类型的定义放在头文件,即使被不同的源文件包含,因为类型不具有外部连接特性,所以不会报重定义错误的,这和变量和函数不同,不能将变量和函数的定义放在头文件!切记!...这里所说的外部连接与内部连接的区别在于链接器接的时候是否将当前目标文件中的定义与其它目标文件对比,并报告是否有重定义错误。内连接不会进行对比,故不同源文件中定义相同名称的类型是不会报错的。

    1.6K20

    Javascript中作用域的理解?

    当你继续在阅读这篇文章时,你将会意识到你的代码的scope有助于提高效率,跟踪Bug。当变量具有相同的名称但在不同的作用域时,作用域也解决了命名问题。...JavaScript中的作用域 在JavaScript语言中有两种类型的作用域: 全局作用域 局部作用域 函数内部定义的变量存在于局部作用域,而在函数外部定义的变量存在于全局作用域。...局部作用域名只有调用并执行了函数才存在。 上下文(context) 许多开发人员经常混淆作用域(scope)和上下文(context),很多时候误解为它们是相同的一个概念。但事实并非如此。...但是,但是它不能向其父对象反向传递,意味着变量 likes 不能被其父对象访问。这也告诉我们,在不同执行上下文中具有相同名称的变量从执行堆栈的顶部到底部获得优先级。...这是一个在 window 上下文中调用的自动调用的匿名函数,这意味着 this的值为window。暴露一个单一的全局接口来进行交互。

    91330

    类和对象(3)

    实际上,许多编译器会允许这种用法,但_a2会使用_a1的当前(未定义)值进行初始化,这通常是一个未定义行为(Undefined Behavior, UB),但在实践中,它可能会表现为使用某个随机值。...explicit关键字 构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值 的构造函数,还具有类型转换的作用。...:_scount = 0; // 在类定义外部初始化静态成员_scount,初始值为0 void TestA() { cout 函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在 类的内部声明,声明时需要加friend关键字。...比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接 访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。

    6110

    《挑战30天C++入门极限》C++面向对象编程入门:类(class)

    setnum()间接对私有成员number进行赋值操作 cout的值 cin.get(); }   好了,介绍了在类内部定义成员函数...,但要注意的是,在类的内部必须预先声明: void test::rp()   在函数类型的后面加上类的名称再加上域区分符(::)再加函数名称,利用这样的方法我们就在类的外部建立了一个名为rp的test...问题二   域区分符和外部全局变量和类成员变量之间的关系。   在上面的代码中我们看到了,外部全局和类内部都有一个叫做pp的整形变量,那么我们要区分操作他们用什么方法呢?   ...public那么它默认的就是private就是私有的,私有声明可以保护成员不能够被外部访问,但在c++还有一个修饰符,它具有和private相似的性能,它就是protected修饰符。   ...,badball为坏求数量 { int gradescore=0;    //新定义一个和成员变量float gradescore相同名字的类成员函数局部变量

    69610

    Scala专题系列(九) : Scala函数式编程

    对于一个输入类型A和输出类型B的函数f(scala里面写为:A=>B 读作 A 到 B) 它是一种将所有A类型的值a关联到某个确切的B类型的值b的运算过程,即b完全由a来决定,任何内部或者外部过程的状态改变都不会影响到...由于可以忽略上下文,引用是透明的,从而,第一,我们可以在任何地方调用函数,并确定其行为与上下文无关,每次的行为都能够确保相同,由于没有任何全局对象被修改,对函数的并发调用也是安全可靠的,不需要任何线程安全的编写技巧...首先我们的输出值为 122880,与之前相同,但接着输出值为 933120。尽管 multiplier 是一个不可变的函数字面量,当 factor 改变时, multiplier 的行为也跟着改变。...然后调用 m1,将 m2 的返回值传递给它。尽管 factor 变量已经离开了 m1 的作用域,但程序的输出与之前的例子相同,仍为 122880。...Lambda 一种匿名函数。在它的定义中,可能有也可能没有引用外部的未绑定变量。 闭包 是一个函数,可能匿名或具有名称,在定义中包含了自由变量,函数中包含了环境信 息,以绑定其引用的自由变量。

    39510

    javascript中function用法_年终总结反思不足之处

    可以在函数内部访问到变量 color 就是因为可以在这个作用域链中找到它。内部环境可以通过作用域链访问所有外部环境,但外部环境不能访问内部环境的任何变量和函数。...创建闭包的常见方式,就是在一个函数内部创建另一个函数。之所以能够访问外部作用域的变量,是因为内部函数的作用域链中包含外部作用域。...无论什么时候在函数中访问一个变量,就会从作用域链中搜索具有相应名字的变量,一般来讲当函数执行完后,局部活动对象会被销毁,内存中仅保留着全局作用域(全局执行环境的变量对象)。但是闭包的情况又有所不同。...在另一个函数内部定义的函数会将包含函数(外部函数)的活动对象添加到它的作用域链里,当外部函数执行完后其活动对象不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。...();// 0 this对象 this 对象是在运行时基于函数的执行环境绑定的: 全局函数中, this 等于 window 函数被作为某个对象的方法调用时, this 等于那个对象 匿名函数的执行环境具有全局性

    50110

    C++ 知识点总结篇

    const 在不同位置时的不同意义 指针类型前:声明一个指向常量的指针,程序中不能通过指针来改变它所指向的值,但指针本身的值可以改变,即指针可以指向其他数据; "*"号和指针名之间,声明一个指针常量(常指针...,使它指向一个函数入口地址,赋值语法格式为:函数指针名 = 函数名,其中函数名代表的函数必须是一个已经定义过的,和函数指针具有相同返回类型的函数,指针调用函数格式:(*指针变量)(实参列表); 访问权限...、做公共及用户要求的善后工作; 析构函数无参数和返回值,一个类中只能定义一个析构函数,故不能重载,格式为: ~(); 内存布局 全局数据区:存放全局变量、静态数据、常量; 代码区:存放类成员函数...:父类的公有成员和保护成员成为子类的保护成员,且只能被他的派生类成员函数或友元访问,父类私有成员仍为私有; 派生类构造函数调用顺序: 调用基类的构造函数,调用顺序按继承时说明的顺序; 调用子对象类的构造函数..., 友元函数 在类中定义过,但不是成员函数,定义在类外部,但有权访问类中成员; this 指针 只有成员函数才有 this指针,友元函数没有 this 指针; 静态成员函数与普通成员函数区别: 静态成员函数没有

    50830
    领券