美文网首页
函数与作用域

函数与作用域

作者: mianmiani | 来源:发表于2017-03-10 17:13 被阅读0次

函数声明和函数表达式有什么区别

  1. 函数声明会提升到当前作用于执行之前;而函数表达式提升的声明是变量的声明。
  2. 函数声明必须有标识符,也就是函数名;函数表达式的函数名可以省略。
  3. 函数的声明不一定要放到调用的前面;函数表达式的声明必须放到调用的前面。
//函数声明
function myName(name){
console.log(name)
}
//函数表达式
var= myName = function(){
console.log(name)
}

什么是变量的声明前置?什么是函数的声明前置

  • 变量的声明前置:
    提升变量的声明到当前作用于执行之前,此时变量的值为undefined;
  • 函数的声明前置:
    提升函数的声明到当前作用于执行之前,所以在当前作用域的任何地方都可以调用函数;

arguments 是什么

arguments是一种类数组对象,可以通过arguments[0,1,2,]来获取传入参数。

函数的"重载"怎样实现

  1. 根据传入参数的类型执行不同的操作。
  2. 利用参数中特殊的参数值进行不同的操作。
  3. 根据参数的个数进行重载。
    简言之:函数的“重载”就是根据参数的不同属性执行对应的逻辑。
    例:
 function fn() {
            switch (arguments.length) {
                case 0:
                    //执行语句块
                    break;
                case 1:
                    //执行语句块
                    break;
                case 2:
                    //执行语句块
                    break;
                default:
                    break;
            }
        }
//根据参数的个数进行重载

立即执行函数表达式是什么?有什么作用

写法:

(function(){
})()
//用括号形成函数表达式
1,function(){
}()
//用逗号形成函数表达式

立即执行函数表达式的作用就是隔离函数,不会出现变量污染的情况。

求n!,用递归来实现

function factor(result){
if(result === 1){
return 1
}
return result *factor(result-1)
}

以下代码输出什么?

    function getInfo(name, age, sex){
        console.log('name:',name);
        console.log('age:', age);
        console.log('sex:', sex);
        console.log(arguments);
        arguments[0] = 'valley';
        console.log('name', name);
    }

getInfo('饥人谷', 2, '男');
                            //输出
                            name: 饥人谷
                            age: 2
                            sex: 男
                            ["饥人谷","2","男"]
                            name valley  //
getInfo('小谷', 3);
                            //输出
                            name: 小谷
                            age: 3
                            sex: undefined
                            ["小谷","3"]
                            name valley//
getInfo('男');
                            //输出
                            name: 男
                            age: undefined
                            sex: undefined
                            ["男"]
                            name valley//

写一个函数,返回参数的平方和?

   function sumOfSquares(){
   var a =0;
   for(var i=0;i<=arguments.length;i++){
     a = + Math.pow(arguments[i],2)
   }
   return a
 }
   var result = sumOfSquares(2,3,4)
   var result2 = sumOfSquares(1,3)
   console.log(result)  //29
   console.log(result2)  //10

如下代码的输出?为什么

    console.log(a);
    var a = 1;
    console.log(b);
//报错 因为b没有声明;如果去掉console(b);则会输出undefined,因为变量声明提升了,但是赋值在输出之后。

如下代码的输出?为什么

    sayName('world');
    sayAge(10);
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    };
//hello world
报错,因为函数表达式必须先声明再调用。

如下代码输出什么? 写出作用域链查找过程伪代码

var x = 10
bar() 
function foo() {
  console.log(x)
}
function bar(){
  var x = 30
  foo()
}
//查找过程伪代码:
globalContext = {
AO:{
x:10
foo:function
bar:function
}
Scope:null
}
foo.[[Scope]] = globalContext.AO
bar.[[Scope]] = globalContext.AO
barContext = {
AO:{
x:30
foo:function
}
Scope:bar.[[Scope]] = globalContext.AO
}
fooContext = {
AO:{
}
    Scope:foo[[Scope]] =globalContext.AO
//

执行console.log(x)时 在fooContext里找不到,所以到globalContext.AO里找到x=10,所以输出10

  1. 如下代码输出什么? 写出作用域链查找过程伪代码
var x = 10;
bar() 
function bar(){
  var x = 30;
  function foo(){
    console.log(x) 
  }
  foo();
}
//查找过程伪代码
globalContext = {
AO:{
x:10
bar:function
}
Scope:null
}
bar.[[Scope]]:globalContext.AO
barContext = {
AO:{
x:30
foo:function
}
Scope:bar.[[Scope]]globalContext.AO
}
foo.[[Scope]]:barContext.AO
fooContext = {
AO:{
}
Scope:foo.[[Scope]]barContext.AO
}

在barContext里找到X=30;所以输出30。

  1. 以下代码输出什么? 写出作用域链的查找过程伪代码
var x = 10;
bar() 
function bar(){
  var x = 30;
  (function (){
    console.log(x)
  })()
}
//查找过程伪代码
globalContext = {
AO:{
x:10
bar:function
}
Scope:null
}
bar.[[Scope]] = globalContext.AO
barContext = {
AO:{
x:30
(function()) = (function())()
}
bar.[[Scope]]globalContext.AO
}
bar.[[Scope]] = globalContext.AO

输出30

  1. 以下代码输出什么? 写出作用域链查找过程伪代码
var a = 1;
function fn(){
  console.log(a)
  var a = 5
  console.log(a)
  a++
  var a
  fn3()
  fn2()
  console.log(a)
  function fn2(){
    console.log(a)
    a = 20
  }
}
function fn3(){
  console.log(a)
  a = 200
}
fn()
console.log(a)
//查找过程伪代码
globalContext = {
AO:{
a:1 200
fn:function
fn3:function
}
Scope:null
}
fn.[[Scope]] = globalContext.AO
fn3.[[Scope]] = globalContext.AO
fnContext = {
AO:{
a:undefined 5 6 20
fn2:function
}
Scope:globalContext.AO
}
fn2:[[Scope]]=function.AO
fn3Context = }
AO:{
}
Scope:globalContext.AO
}
fn2Context = {
AO:{
}
Scope:fnContext.AO
}

输出为:undefined ,5 , 1, 6 ,20 ,200

相关文章

  • 执行上下文、作用域链、this、闭包

    javascript 执行的是词法作用域,即静态作用域。与之相对的是动态作用域。 静态作用域:函数的作用域在函数定...

  • 作用域和作用域链

    作用域和作用域链 作用域 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在Java...

  • 作用域

    何为作用域 任何编程语言都有作用域的概念,简单来说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可...

  • JavaScript中的作用域和作用域链(一)

    作用域 1.作用域的概念: 变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。 2.全局作用域与...

  • JavaScript静态作用域解析

    静态作用域与动态作用域 因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。而与...

  • 词法作用域 - 2023-02-09

    静态作用域与动态作用域 因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。而与...

  • JS基础知识(2) -- 作用域和作用域链

    作用域 作用域就是变量与函数的可访问范围 全局作用域 函数作用域 ES6块级作用域 ES5没有块级作用域,ES6有...

  • 作用域链

    一、作用域 定义:作用域就是变量与函数的可访问范围。作用域控制着变量与函数的可见性和生命周期。 1、全局作用域(G...

  • JavaScript作用域学习笔记

    @(JS技巧)[JavaScript, 作用域] JavaScript作用域学习笔记 概念: 作用域就是变量与函数...

  • 我的JS笔记 -- 作用域

    作用域和作用域链概念 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaSc...

网友评论

      本文标题:函数与作用域

      本文链接:https://www.haomeiwen.com/subject/dmongttx.html