每日一道javascript面试题(九)函数的参数可以和函数体中的变量重名吗

简介: 每日一道javascript面试题(九)函数的参数可以和函数体中的变量重名吗

前言

  • 我是小嘟,努力每天分享一道javascript相关的题目。
  • 希望对你有所帮助。
  • 觉得有用的话,请点赞支持,你的鼓励是我坚持下去的动力。
  • 今天在牛客看面经的时候,发现这个题目,虽然只有几行代码,但是考的知识点还是挺难理解的。
  • 大家一起来看看吧!说的不对的地方欢迎指出。

题目一

function f(x = 3){
     var x;
     console.log("我是f的x:",x);
}
f(5) ;


  • 结果如下
本题知识点

本题考查知识点:函数的参数和函数体中的变量到底能不能重名呢?

小嘟这个题也做错了,然后就去看了阮老师的es6文档,从中又学到了新的知识(真的是每次读每次有新的感悟)。

感悟:参数变量是默认声明的,所以在函数体中不能再用let或const声明(这个是官方文档里边说的哦),但是用var还可以声明的,说到这里我们还是不能解决这个问题,然后我又参考了木易杨大佬的解释:

  • 总结一下:我们不能用let和const再次声明已经存在的变量名,用var声明的变量不会覆盖参数的变量。


  • 对var再详细说下
  • (1)如果在函数体仅仅是声明变量但是没有赋值,那么在函数体中打印该变量的值则是参数中存储的值。
  • (2)如果声明并且赋值了,那么在函数体中打印该变量的值则是函数体中变量的值,请看下边的例子:


function f(x = 3){
     var x;
     console.log("我是f的x:",x);
}
f(5);
function f1(x = 3){
     var x = 7;
     console.log("我是f1的x:",x);
}
f1(5);
结果如下

题目二(函数作用域)

function f2(x, y = function() {console.log("我是赋值前的x:",x); x = 2; console.log("我是赋值后的x:",x); }) 
{
      var x = 3;
      y();
      console.log("我是函数体中的x:",x);
}
f2();


结果如下

分析
  • 读者是不是都迷糊啦,说实话,小嘟我也迷啦,所以这篇文章小嘟写了好几天,生怕什么地方解释的太离谱了。若觉得不错请点赞支持,小嘟我会继续努力的。
  • 这个题我在阮老师的文档中找到了依据:



也正是因为如此,y中x指向的是参数中的x而不是函数体中的x,说到这里大家应该基本明白这个结果为什么是这样。这里小嘟产生了一个新的问题:既然是不同的作用域,那么为什么不能使用let和const声明相同的变量名呢?

最后我给自己的解释是:是不同的作用域,但是不是不同的块级作用域,(js中有函数作用域、全局作用域、块级作用域,这里我认为应该是在同一个块级作用域,否则不应该报语法错误)所以应该是这样的一个原因。(大家仅供参考,欢迎下方指正)

  • 说了这么多还没有演示letconst声明会发生什么呢?

题目三(let声明)

function f(x = 3){
     var x;
     console.log("我是f的x:",x);
}
f(5);
function f1(x = 3){
     var x = 7;
     console.log("我是f1的x:",x);
}
f1(5);
function f2(x = 3){
     let x;
     console.log("我是f2的x:",x);
}
f2(5) ;
结果如下

  • 我们知道js会有一个预编译的过程,将函数声明提升、将var声明的变l量提升、检查语法等。从这个结果中我们会发现一个结果都没有执行,如果没有预编译的过程那么应该会输出前两个结果的。

题目四(const声明)

function f(x = 3){
     var x;
     console.log("我是f的x:",x);
}
f(5);
function f1(x = 3){
     var x = 7;
     console.log("我是f1的x:",x);
}
f1(5);
function f3(x = 3){
      const x;
      console.log("我是f3的x:",x);
}
f3(5) ;


结果如下

结尾

  • 以上就是本节内容,若有问题,欢迎评论区留言。
  • 觉的对你有所帮助,请点赞👍评论👈,要是能给个关注➗更
相关文章
|
8天前
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
1月前
|
JavaScript 前端开发 开发者
JavaScript基础——JavaScript变量名称命名规范
JavaScript变量命名规范是编写高质量代码的重要部分。通过遵循基本规则、使用常见命名约定并应用最佳实践,可以提高代码的可读性和可维护性。希望本文能帮助开发者在日常编程中更好地理解和应用JavaScript变量命名规范,从而编写出更清晰、更可靠的代码。
76 11
|
2月前
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
84 32
|
1月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
3月前
|
JavaScript 前端开发 容器
盘点JavaScript中所有声明变量的方式及特性
本文详细介绍了JavaScript中变量定义的多种方式,包括传统的`var`、`let`和`const`,以及通过`this`、`window`、`top`等对象定义变量的方法。每种方式都有其独特的语法和特性,并附有代码示例说明。推荐使用`let`和`const`以避免作用域和提升问题,谨慎使用`window`和`top`定义全局变量,不建议使用隐式全局变量。掌握这些定义方式有助于编写更健壮的JS代码。
71 11
|
5月前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
182 63
|
5月前
|
JavaScript 前端开发 Java
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
本文介绍了JavaScript中常用的函数和方法,包括通用函数、Global对象函数以及数组相关函数。详细列出了每个函数的参数、返回值及使用说明,并提供了示例代码。文章强调了函数的学习应结合源码和实践,适合JavaScript初学者和进阶开发者参考。
69 2
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
|
5月前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
8月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
5月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!

热门文章

最新文章