网站首页 > 技术文章 正文
js面试题
1.闭包程序分析2.JS中有几种函数3.创建函数的几种方式- 声明函数- 创建匿名函数表达式- 创建具名函数表达式- Function构造函数- 自执行函数- 其他创建函数的方法4.下面代码的输出是什么?
1.闭包程序分析
1function fun(n,o) {
2 console.log(o)
3 return {
4 fun:function(m){
5 return fun(m,n);
6 }
7 };
8}
9var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,?,?,?
10var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
11var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,?
12//问:三行a,b,c的输出分别是什么?
13
14//答案:
15//a: undefined,0,0,0
16//b: undefined,0,1,2
17//c: undefined,0,1,1
2.JS中有几种函数
首先,在此之前需要了解的是,在JS中函数可以分为两种,具名函数(命名函数)和匿名函数。
区分这两种函数的方法非常简单,可以通过输出 fn.name 来判断,有name的就是具名函数,没有name的就是匿名函数
注意:在低版本IE上无法获取具名函数的name,会返回undefined,建议在火狐或是谷歌浏览器上测试
或是采用兼容IE的获取函数name方法来获取函数名称:
1/**
2 * 获取指定函数的函数名称(用于兼容IE)
3 * @param {Function} fun 任意函数
4 */
5function getFunctionName(fun) {
6 if (fun.name !== undefined)
7 return fun.name;
8 var ret = fun.toString();
9 ret = ret.substr('function '.length);
10 ret = ret.substr(0, ret.indexOf('('));
11 return ret;
12}
3.创建函数的几种方式
说完函数的类型,还需要了解JS中创建函数都有几种创建方法。
- 声明函数
最普通最标准的声明函数方法,包括函数名及函数体。
function fn1(){}
- 创建匿名函数表达式
创建一个变量,这个变量的内容为一个函数
var fn1=function (){}
注意采用这种方法创建的函数为匿名函数,即没有函数name
var fn1=function (){};
getFunctionName(fn1).length;//0
- 创建具名函数表达式
创建一个变量,内容为一个带有名称的函数
var fn1=function xxcanghai(){};
注意:具名函数表达式的函数名只能在创建函数内部使用
即采用此种方法创建的函数在函数外层只能使用fn1不能使用xxcanghai的函数名。xxcanghai的命名只能在创建的函数内部使用
- Function构造函数
可以给 Function 构造函数传一个函数字符串,返回包含这个字符串命令的函数,此种方法创建的是匿名函数
1 // 传统的
2 function foo () {
3 console.log( '你好' );
4 }
5 // Function
6 var func = new Function( 'console.log( "你好" );' );
7 // 功能上, 这里 foo 与 func 等价
- 自执行函数
(function(){alert(1);})();
(function fn1(){alert(1);})();
- 其他创建函数的方法
当然还有其他创建函数或执行函数的方法,这里不再多说,比如采用 eval , setTimeout , setInterval 等非常用方法,这里不做过多介绍,属于非标准方法,这里不做过多展开
4.下面代码的输出是什么?
1function sayHi() {
2 console.log(name);
3 console.log(age);
4 var name = "Lydia";
5 let age = 21;
6}
7sayHi();
A: Lydia 和 undefined
B: Lydia 和 ReferenceError
C: ReferenceError 和 21
D: undefined 和 ReferenceError
答案: D
在函数中,我们首先使用var关键字声明了name变量。这意味着变量在创建阶段会被提升(JavaScript会在创建变量创建阶段为其分配内存空间),默认值为undefined,直到我们实际执行到使用该变量的行。我们还没有为name变量赋值,所以它仍然保持undefined的值。
使用let关键字(和const)声明的变量也会存在变量提升,但与var不同,初始化没有被提升。在我们声明(初始化)它们之前,它们是不可访问的。这被称为“暂时死区”。当我们在声明变量之前尝试访问变量时,JavaScript会抛出一个ReferenceError。
猜你喜欢
- 2024-10-05 前端面试,你有必要知道的一些JavaScript 面试题(上)
- 2024-10-05 几道看起来代码量很少的Javascript笔试题,看看你会不会做?
- 2024-10-05 前端面试题《JS基础》 前端面试 js
- 2024-10-05 前端面试题JavaScript 前端面试题目100及最佳答案
- 2024-10-05 day6:前端面试题(js) js前端面试题及答案
- 2024-10-05 2023年最新的JavaScript面试题 锦屏县2023年幼儿园面试题
- 2024-10-05 20个基本的JavaScript面试问题及答案
- 2024-10-05 逐渐深入的Javascript面试题,看看你能过几关?
- 2024-10-05 谷歌面试7个简单又棘手的前端JavaScript面试题
- 2024-10-05 day10:前端面试题(js) 前端面试题及答案 知乎
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)