版权声明:本文出自水寒的原创文章。未经博主同意不得转载。

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(); //red

JavaScript你所不知道的困惑(3)的更多相关文章

  1. JavaScript你所不知道的困惑(2)

    困惑一: var obj1 = new Object(); var obj2 = obj1; obj1.name = "阳光小强"; alert(obj2.name); //输出结 ...

  2. JavaScript你所不知道的困惑(1)

    困惑一: 先看一个样例: function test(){ message = "hi"; } test(); alert(message); 会输出字符串"hi&quo ...

  3. JavaScript中你所不知道的Object(二)--Function篇

    上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.Str ...

  4. js值----你所不知道的JavaScript系列(6)

    1.数组 在 JavaScript 中,数组可以容纳任何类型的值,可以是字符串.数字.对象(object),甚至是其他数组(多维数组就是通过这种方式来实现的) .----<你所不知道的JavaS ...

  5. js类型----你所不知道的JavaScript系列(5)

    ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型等. 1.内置类型 JavaScript 有七种内置类型: • 空值(null) • 未定义( ...

  6. 闭包----你所不知道的JavaScript系列(4)

    一.闭包是什么? · 闭包就是可以使得函数外部的对象能够获取函数内部的信息. · 闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. · 闭包就 ...

  7. 你所不知道的setInterval

    在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...

  8. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  9. 你所不知道的 URL

    0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...

随机推荐

  1. Hive 差集运算

    差集定义:一般地,设A,B是两个集合,由所有属于A且不属于B的元素组成的集合,叫做集合A减集合B(或集合A与集合B之差). 类似地,对于集合A,B,我们把集合{x/x∈A,且x¢B}叫做A与B的差集, ...

  2. 【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)

    插入排序基本思想 每次将一个待排序的记录按其keyword大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完毕为止. 直接插入排序 基本思想 直接插入排序的基本操作是将一个记录插入到已排好 ...

  3. 88. Merge Sorted Array【easy】

    88. Merge Sorted Array[easy] Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 ...

  4. gdb 详解

    环境:gcc (OpenWrt/Linaro GCC 4.8) 以如下的简单代码为例,说明gdb的使用. void func1(int a, int b) { int c; c = a + b; } ...

  5. c++ 宏 #val 在unicode下的使用。

    #define CHECK(condition) cout<<check failed:<<#condition<<endl; 上面这句宏,当你 CHECK(myf ...

  6. 基于C#的超市收银管理系统

    基于C#的超市收银管理系统 前序 一直在忙学习Qt有关的知识,非常有幸这学期学习了C#.让我也感觉到了一丝欣慰,欣慰的是感觉好上手啊,学了几天顿时懂了.好多控件的使用方法好类似,尽管平时上课没有怎么认 ...

  7. HugePage简介和KVM中使用HugePage

    现在,有许多的处理器架构都支持多种的内存页大小,其中就包括比一般的page size大很多的huge page.就目前来说,尽管在个人电脑中基本都实现了对huge page的支持,然而,huge pa ...

  8. Spring 3 MVC and JSR303 @Valid example

    http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/ ———————————————————————————— ...

  9. jq serialize 系列化 乱码 解决办法

    query = form.find('input,select,textarea').serialize(); $.post(target,decodeURIComponent(query)).suc ...

  10. valgrind调查内存leak

    快有几个月没更新了,记录一下最近解决问题用到的工具吧. 最近代码跑压力测试,总是发现内存在无规律的慢慢增加,因此在Android上用上了大名顶顶的valgrind,说实话,真是名不虚传, 真是建议以后 ...