JavaScript你所不知道的困惑(3)
https://blog.csdn.net/lxq_xsyu/article/details/25600011
困惑一:
window.color = "red";
var o = {color: "blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
call方法能扩充函数作用域。每一个函数都包括两个非继承而来的方法:apply()和call(),这两个方法的用途是在特定的作用域中调用函数。
function sum(num1, num2){
return num1 + num2;
}
function callSum1(num1, num2){
return sum.apply(this, arguments);
}
function callSum2(num1, num2){
return sum.apply(this, [num1, num2]);
}
alert(callSum1(10, 10));
alert(callSum2(10, 10));
call()方法与apply()方法的作用同样,它们的差别仅在于接收參数的方式不同。对于call()方法而言。第一个參数是this值没有变化,变化的是其余參数都直接传递參数。
困惑二:
function add10(num){
return num + 10;
}
function getGreeting(name){
return "hello" + name;
}
function callSomeFunction(someFunction, someArgument){
return someFunction(someArgument);
}
var result1 = callSomeFunction(add10, 10);
alert(result1); //20
var result2 = callSomeFunction(getGreeting, "阳光小强");
alert(result2); //"hello阳光小强"
在ECMAScript中的函数名本身就是变量。所以函数也能够作为值来使用。
困惑三:
function factorial(num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num - 1);
}
}
alert(factorial(10));
上面代码中的arguments.callee是什么意思?
在函数内部有两个特殊的对象:arguments和this。argument的主要作用是保存函数參数,但这个对象另一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。另个个特殊对象this,是函数运行的环境对象。
困惑四:
eval("alert('hi')"); //hi
eval方法就像是一个完整的ECMAScript解析器。它仅仅接受一个參数。当解析器发现代码中调用eval方法时,它会将传入的參数当作实际的ECMAScript语句来解析,然后把运行结果插入到原位置。
ECMAScript中内置对象,由ECMAScript实现提供的,不依赖于宿主环境的对象。这些对象在ECMAScript程序运行之前就已经存在了。
开发者不必显式的实例化内置对象,由于它们已经实例化了。
如:Object、Array和String。ECMA-262还定义了两个单体内置对象:Global和Math
ECMAScript中的Global对象在某种意义上是作为一个终极的“兜底儿对象”来定义的。换句话说。不属于不论什么其它对象的属性和方法。终于都是他的属性和方法。其实。没有全局变量和全局函数;全部在全局作用域中定义的属性和函数。都是Global对象的属性。
如:isNaN()、isFinite()、parseInt()以及parseFloat()实际上都是Global对象的方法。
除此之外,Global对象还包括了其它一些方法。
1、URL编码方法。
2、eval()方法。
ECMAScript中尽管没有指出怎样直接訪问Global对象,但web浏览器都是将这个全局对象作为window对象的一部分加以实现的。因此。在全局作用域中声明的全部变量和函数,就都成为了window对象的属性。
3、Global对象还包括一些属性如undefined、NaN以及Infinity等。
4、Web浏览器都是将Global对象作为window对象的一部分加以实现的。因此,在全局作用域中声明全部变量和函数,就都成为了window对象的属性。
var color = "red";
function sayColor(){
alert(window.color);
}
window.sayColor(); //redJavaScript你所不知道的困惑(3)的更多相关文章
- JavaScript你所不知道的困惑(2)
困惑一: var obj1 = new Object(); var obj2 = obj1; obj1.name = "阳光小强"; alert(obj2.name); //输出结 ...
- JavaScript你所不知道的困惑(1)
困惑一: 先看一个样例: function test(){ message = "hi"; } test(); alert(message); 会输出字符串"hi&quo ...
- JavaScript中你所不知道的Object(二)--Function篇
上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.Str ...
- js值----你所不知道的JavaScript系列(6)
1.数组 在 JavaScript 中,数组可以容纳任何类型的值,可以是字符串.数字.对象(object),甚至是其他数组(多维数组就是通过这种方式来实现的) .----<你所不知道的JavaS ...
- js类型----你所不知道的JavaScript系列(5)
ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型等. 1.内置类型 JavaScript 有七种内置类型: • 空值(null) • 未定义( ...
- 闭包----你所不知道的JavaScript系列(4)
一.闭包是什么? · 闭包就是可以使得函数外部的对象能够获取函数内部的信息. · 闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. · 闭包就 ...
- 你所不知道的setInterval
在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...
- 你所不知道的setTimeout
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...
- 你所不知道的 URL
0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...
随机推荐
- rational rose 2007安装破解全过程
1:下载安装文件 下载地址: http://pan.baidu.com/s/1c0ldKEs 2:下载虚拟光驱 由于下载的文件须要光驱安装,所以须要下载一个虚拟光驱,虚拟光驱名称:daemon too ...
- usb转串口模块下载时遇到的问题
ch340g usb转TTL模块,烧写wifi模块ESP8266固件时,为图省事,我直接用的该模块的3.3v电为wifi模块供的电,结果刚一上电就出现串口模块消失(听到噔的一声),电脑设备管理器里就看 ...
- Hive学习 系列博客
原 Hive作业优化 原 Hive学习六:HIVE日志分析(用户画像) 原 Hive学习五--日志案例分析 原 Hive学习三 原 Hive学习二 原 Hive学习一 博客来源,https://blo ...
- 下载The Swift Programming Language.mobi版
下载 The Swift Programming Language.mobi 下载 http://download.csdn.net/detail/swifttrain/7444501
- android studio中文乱码问题
在build.gradle中加入代码: tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
- 43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
[视频&交流平台] àSpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008&utm ...
- Unity3D - 使用TexturePacker打包图集以及NGUI对旋转sprites的支持
作者:EnigmaJJ 博客地址:http://www.cnblogs.com/twjcnblog/ 在Unity中使用NGUI时,为了减少draw call,我们会将美术用到的小图打成一张图集,如图 ...
- dos2unix dos文本转换为linux文本 /bin/bas^M:bad interpreter
第一种方法:dos2unix -f 文本名 第二种方法: 首先:vi 文本名 然后::set ff? 如果出现fileforma=dos那么就确定是linux和windows之间的不完全兼容 :set ...
- eclipse中mat插件使用
http://smallnetvisitor.iteye.com/blog/1826434 User.java class User { private String id; private Stri ...
- iOS 学习笔记三【segmentedControl分段控制器详细使用方法】
在iOS开发过程中,分段控制器的使用频率还是蛮高的,下面是我写的一个简单的demo,大家可以把代码直接复制过去,就可以使用,ios9最新支持. // // ViewController.m // 03 ...