首页
学习
活动
专区
工具
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和解决面试中这类常见问题重要概念

18410

针对高级前端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和解决面试中这类常见问题重要概念

21330
  • 细数 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 内部形成了一个单独作用域,可以封装一些外部无法读取私有变量。

    46540

    分享 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 和在面试中解决此类问题重要概念,这些问题往往会被问到很多

    52730

    JavaScript(八)

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

    22220

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

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

    58920

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

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

    57130

    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; 但在JavaScriptES6中,提供了const

    38310

    重学JavaScript之匿名函数

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

    1.7K20

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

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

    44510

    Go 切片使用绕坑指南

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

    1.2K20

    申明与定义区别

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

    1.5K20

    Javascript中作用域理解?

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

    90930

    类和对象(3)

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

    5810

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

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

    69010

    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 一种匿名函数定义中,可能有也可能没有引用外部未绑定变量。 闭包 是一个函数,可能匿名或具有名称,定义中包含了自由变量,函数中包含了环境信 息,以绑定其引用自由变量。

    38710

    C++ 知识点总结篇

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

    50430

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

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

    48410

    存储类别、链接和内存管理(一)--面试中你遇到过static关键字吗?

    存放在一段连续内存空间里,假设从地址0x56000000开始,那pc存放就是0x56000000,即pc存放了字符串地址。...如果在 两个块中使用相同标签会很混乱,标签函数作用域防止了这样事情发 生。 函数原型作用域范围是从形参定义处到原型声明结束。...定义函数体外,这样变量可用于多个函数,所以文件作用域变量也称为全局变量(global variable)。 所以,局部变量具有块作用域,全局变量具有文件作用域。...具有块作用域、函数作用域或函数原型作用域变量都是无链接变量。 具有文件作用域变量可以是外部链接或内部链接。...一 些程序员把“内部链接文件作用域”简称为“文件作用域”,把“外部链接文件作用域”简称为“全局作用域”或“程序作用域”。 那么如何知道文件作用域是内部链接还是外部链接呢?

    36920
    领券