关于为函数形参赋值和搜索变量标识符的云云

为形参提供默认值是以前的一种流行方法:

function foo(a){
    a=a||1;
    console.log(a);
}

foo();     // 1
foo(12);  // 12

你看,如果函数调用时不提供实参,形参a会被赋1。另:最好不要修改形参,参见竟然修改形参有这么可怕的后果

形参本身是局部变量,只能在函数内访问:

function foo(a){
    console.log(a);
}

foo(12);   // 12

console.log(a);  // Uncaught ReferenceError: a is not defined

比如,你可以这样:

function foo(){
    a=‘lala‘;
}

foo();

console.log(a);  // lala

引擎在foo函数的作用域和全局作用域找不到名为a的变量,在非严格模式下就会在全局作用域创建一个名为a的全局变量,此时如果为函数添加名为a的形参就可以

阻止这种事情发生:

function foo(a){
    a=‘lala‘;
}

foo();

console.log(a);  // Uncaught ReferenceError: a is not defined

因为引擎已经在函数的作用域内找到了名为a的变量,所以不会在全局作用域创建名为a的全局变量,此时,如果再在函数内声明名为a的变量就已经是重复声明了:

function foo(a){
    var a=‘lala‘;
    console.log(a);
}

foo();  // lala

此时JShint等代码检查工具就会警告:

虽然JS的重复声明会被引擎忽略,但不建议这么做。

最后,我真想吐槽博客园的光标,特么的怎么总是莫名其妙跳到别处!害得总是修改原来写好的代码!

以上。

原文地址:https://www.cnblogs.com/linweinb/p/8728034.html

时间: 2024-10-28 15:03:23

关于为函数形参赋值和搜索变量标识符的云云的相关文章

关于python函数形参、实参和变量作用域的分析

大家都知道,程序代码行数一旦到一定程度,给变量.函数.类起名字是个头疼的问题.尤其函数还有形参.实参的问题. 这里面很容易产生引用错误,作用域错误的问题.看下面的例子: def test(a): a = 20 print("这是在调用函数之时的值: %s"%a)a = 10print("这是在调用函数之前的值: %s"%a)test(a)print("这是在调用函数之后的值: %s"%a) 运行结果: 这是在调用函数之前的值: 10 这是在调用函

函数名也可以当做变量,

函数名是一个特殊的变量,加括号就能执行函数,函数的名字,本质是变量,特殊的变量 函数名可以当做变量使,可以赋值,可以作为容器类的数据元素,可以作参数,作为函数的返回值 1.赋值 def func1(): print(666) f = func1()  #将函数名赋值给一个变量f print(f) 2.作为容器类的数据元素 def f1(): print(111) def f2(): print(222) def f3(): print(333) def f4(): print(444) #如何只

关于函数形参的一些讨论

形参的初始化与变量的初始化一样:如果形参具有非引用类型,则复制实参的值,如果形参为引用类型,则它只是实参的别名. 非引用形参: 普通的非引用类型的参数通过复制对应的实参实现初始化.当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会修改实参的值. while 循环体虽然修改了 v1 与 v2 的值,但这些变化仅限于局部参数,而对调用 gcd 函数使用的实参没有任何影响.于是,如果有函数调用gcd(i, j),i 与 j 的值不受 gcd 内执行的赋值操作的影响. #includ

error: expected declaration specifiers or '...' before xxx(xxx是函数形参)

在使用带参有返回值的函数指针做参数时,编译出现下面情况 -------- error: expected declaration specifiers or '...' before 'FunType' 情形描述: a.h: typedef void (*FunType)(); void callFun(FunType p); a.c : #include "a.h" FunType myfuntype=NULL; void callFun(FunType p) { myfuntype

《征服 C 指针》摘录5:函数形参 和 空的下标运算符[]

一.函数的形参的声明 C 语言可以像下面这样声明函数的形参: void func(int a[]) {     // ... } 对于这种写法,无论怎么看都好像要向函数的参数传递数组. 可是,在 C 中是不能够将数组作为函数的参数进行传递的.无论如何,在这种情况下,你只能传递指向数组初始元素的指针. 在声明函数形参时,作为类型分类的数组,可以被解读成指针. void func(int a[]) { } 可以被自动地解读为 void func(int *a) { } 此时,就算你定义了数组的元素的

C++静态成员函数不能调用非静态成员变量

其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话 因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在 类的整个生存周期里始终只能存在一份.然而非静态成员变量和非静态成员函数 是针对类的对象而言. 然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能 调用具体实例对象的成员. 下面我们来测试一下: 先在静态成员函数中调用静态成员变量: 1 #include <iostream> 2 using namespace std; 3 4

函数,在函数中赋值,然后输出

public int SumZhiShu(int n)        {            int sum = 0; for (int i = 1; i <= n; i++)            {                 int count = 0;                for (int j = 1; j <= i; j++)                {                    if (i % j == 0)                   

Python、C++中编写函数以及不使用临时变量交换两变量值的比较

在C++中,交换两变量的值一般第一反应都会是如下的代码: { temp=a; a=b; b=temp } 但是题目要求不允许使用临时变量temp呢?可能就需要想一会了.但也有解决办法: { b=a+b; a=b-a; b=b-a; } 这种做法在a和b数值较小的情况下是对的,但是a+b如果很大则会溢出,所以也不是最优的解法.最好的方法是使用异或: { a ^= b b ^=a a ^=b } 在Python中这个问题就太弱智啦! a,b=b,a 直接一行搞定! 如果题目要求编写一个函数来交换两变

从获取函数形参谈toString用法

问题 如何获取一个函数形参?我们都知道通过arguments可以获取运行时的实参值,但是形参值怎么获取,如果我们对toString的用法了解,这个问题就好解答了 toString Function.prototype.toString里有一句话说,在一个函数上直接调用toString方法,会以字符串形式返回这个函数的源码.这里有个重要信息,通过调用toString() 方法可以反编译解析出函数源码,多么强大简单的功能. // 撸代码 function tq(a, b, c) {} tq.toSt