首页 > 编程语言 >一起学习javascript-函数(2)

一起学习javascript-函数(2)

时间:2024-06-09 15:00:56浏览次数:8  
标签:function console 函数 作用域 javascript 学习 log var 变量

<script>

    // 变量作用域与解构赋值

    function f1(y) {

    var x = 1;

    x = x + 2;

    console.log(x+y);

    console.log(x);

    // 因为变量x在函数f1中申明,在这里属于局部变量,所以x只能在f1中访问,f1执行完,x就销毁了

}f1(2);//为了更直观一点,调用一下f1(),传个值

// x = x + 2; console.log("x在这里的值为:"+x);//运行这行时,控制台报错 x is not defined,说明无法访问函数里面的x

function f(y) {

    var x = 1;

    x = x + 1;

    console.log(x+y);}f(2);

// 函数f和f1是两个不同的函数,所以x的值是独立的,f1()调用时,x的值为3,f()调用时,x的值为2

// 简述为两家人关起门来做同一件事情,但互相不影响

// 由于JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行:

function foo() {

    var x = 1;

    function bar() {

        var y = x + 1; // bar可以访问foo的变量x!

    }

    // var z = y + 1; // ReferenceError! foo不可以访问bar的变量y!

}

// 如果内部函数和外部函数的变量名重名怎么办

function foo1() {

    var x = 1;

    function bar1() {

        var x = 'A';

        console.log('x in bar() = ' + x); // 'A'

    }// 城中城自己干自己的互不影响

    console.log('x in foo() = ' + x); // 1

    bar1();

}

foo1();

//变量提升

function foo2() {

    var x = 'Hello, ' + y;//显示unfined

    console.log(x);

    var y = 'Bob';

}

foo2();

// 但语句var x = 'Hello, ' + y;并不报错,原因是变量y在稍后申明了。但是console.log显示Hello, undefined,

// 说明变量y的值为undefined。这正是因为JavaScript引擎自动提升了变量y的声明,但不会提升变量y的赋值。

// 相当于只闻其声不见其人

// 全局作用域

// 不在任何函数内定义的变量就具有全局作用域。实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性:

// var course = 'hello world';

// alert(course); // hello world

// alert(window.course); // hello world

// // 由于函数定义有两种方式,以变量方式var foo = function () {}定义的函数实际上也是一个全局变量,因此,顶层函数的定义也被视为一个全局变量,并绑定到window对象:

// function foo5() {

//     alert('foo5');

// }

// foo5(); // 直接调用foo()

// window.foo5(); // 通过window.foo()调用

// 名字空间

// 全局变量会绑定到window上,不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现。

// 减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。例如:

// 唯一的全局变量MYAPP1:

// var MYAPP1 = {};

// // 其他变量:

// MYAPP1.name = 'my';

// MYAPP1.version = 4.0;

// // 其他函数:

// MYAPP1.foo6 = function () {

//     return 'foo6';

// };

// // 把自己的代码全部放入唯一的名字空间MYAPP1中,会大大减少全局变量冲突的可能。

// 许多著名的JavaScript库都是这么干的:jQuery,YUI,underscore等等。

// 为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:

// 局部作用域

// 由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的:

// function foo7() {

//     for (var i=0; i<100; i++) {

//         //

//     }

//     i += 100; // 仍然可以引用变量i

// }foo7();

// 为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:

// function foo8() {

//     var sum = 0;

//     for (let i=0; i<100; i++) {

//         sum += i;

//     }

//     i += 1;

//     console.log(i);// i is not defined,访问不到for循环里面的变量i了,i属于for循环的块级作用域

// }

// foo8();

// 常量

// const PI=3.14

// 解构赋值

// 现在,在ES6中,可以使用解构赋值,直接对多个变量同时赋值:

// 如果浏览器支持解构赋值就不会报错:

// var [x, y, z] = ['hello', 'JavaScript', 'ES6'];

// console.log('x = ' + x + ', y = ' + y + ', z = ' + z);//x = hello, y = JavaScript, z = ES6

// //忽略某些元素

// let [, , w] = ['hello', 'JavaScript', 'ES6']; // 忽略前两个元素,只对z赋值第三个元素

// w; // 'ES6'

// //对对象进行解构赋值

// var person = {

//     name: '小时',

//     age: 88,

//     gender: 'man',

//     passport: '111111',

// };

// var {name, age, passport} = person;

// console.log('name = ' + name + ', age = ' + age + ', passport = ' + passport);//name = 小时, age = 88, passport = 111111

// 快速获取当前页面的域名和路径:

// var {hostname:domain, pathname:path} = location;

// console.log('domain = ' + domain + ', path = ' + path);//domain = www.baidu.com, path = /

</script>

标签:function,console,函数,作用域,javascript,学习,log,var,变量
From: https://blog.csdn.net/m0_74762754/article/details/139549809

相关文章

  • HarmonyOS ArkTS组件 | Flex 以弹性方式布局子组件的容器组件 学习记录
    HarmonyOSArkTS组件|Flex以弹性方式布局子组件的容器组件学习记录前言:最近需要用到弹性布局,记录一下。(忽略图片水印QAQ)说明:Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替。Flex组件主轴默认不设置时撑满父容器,Column、Row组......
  • [无监督学习] 14.详细图解k-means 算法
    k-means算法把相似的数据汇总为簇的方法叫作聚类。k-means算法是一种聚类算法,该算法非常简单,所以被广泛应用于数据分析。概述k-means算法是一种有代表性的聚类算法。由于该算法简单易懂,又可以用于比较大的数据集,所以在市场分析和计算机视觉等领域得到了广泛的应用。我......
  • CUDA编程学习笔记-02
    CUDA代码高效计算策略高效公式✒️Math代表数学计算量,Memory代表每个线程的内存......
  • Qt 子线程调用connect/QMetaObject::invokeMethod 不调用槽函数问题
    在使用invokeMethod进行跨线程调用的时候,发现invokeMethod在某些情况下不能正常调用.经过查各种资料发现invokeMethod底层的调用逻辑是通过Qt事件循环处理,所以子线程需要显示的调用QEventLoop::exec()或者QCoreApplication::processEvents()执行信号槽处理.首先有一个QDemoObje......
  • python - pandas常用计算函数
    文中所用数据集有需要的可以私聊我获取学习目标 知道排序函数nlargest、nsmallest和sort_values的用法知道Pandas中求和、计数、相关性值、最小、最大、平均数、标准偏差、分位数的函数使用1排序函数导包并加载数据集importpandasaspd​#加载csv数据,返回df......
  • C++入门7 类|构造函数|析构函数
    一,类型设计和实例化对象封装是面向对象程序设计最基本的特性, 把数据 (属性) 和函数 (操作) 合成一个整体,这在计算机世界中是用类与对象实现的。C++中类的设计1 class 类型名称2 {3 public:4 成员列表1;5 protected:6 成员列表2;7 private:8 成员列表3;......
  • 【机器学习】与【数据挖掘】技术下【C++】驱动的【嵌入式】智能系统优化
    目录一、嵌入式系统简介二、C++在嵌入式系统中的优势三、机器学习在嵌入式系统中的挑战四、C++实现机器学习模型的基本步骤五、实例分析:使用C++在嵌入式系统中实现手写数字识别1.数据准备2.模型训练与压缩3.模型部署六、优化与分析1.模型优化模型量化模型剪枝......
  • 使用微分中值定理分析开区间时导数和函数的有界关系
    Step1:微分中值定理简介微分中值定理(MeanValueTheorem,MVT)表明,如果函数f(x)f(x)f(x)在闭区间[a,b][a,b][a,b]上连续,并且在开区间(a,b)(a,b)(a,b)上可导,那么存在一个点c∈(a,b)c\in(a,b)c∈(a,b)使得:f′(c)=f(b)−f(a)b−af'(c)=\frac{f(b)-f(a)}{b-a}f......
  • (C语言)常见字符函数和字符串函数(详解)
    我们都知道,在C语言里有string.h这个头文件,但是C语言里没有string这个类型。字符串通常放在常量字符串中或者字符数组中,字符串常量适用于那些对她不做修改的字符串函数。string.h这个头文件里声明的函数原型也全是针对char数组的种种操作。直到C++中才出现了string这个类这......
  • 如何通过javascript自动增加markdown h1的文本内容?
    背景希望美化博客园博客,至少不希望文本那么密集地显示,而且想自动在headline插入表情符号,自动进行目录和文本缩进等等。问题如何通过javascript自动增加markdownh1的文本内容?方案在html中增加如下js脚本即可。document.addEventListener("DOMContentLoaded",function(){......