资讯专栏INFORMATION COLUMN

js 关于function 的所有疑惑点

loonggg / 3293人阅读

摘要:但是引用对象保存的是,指针地址,所以传入的也是指针地址。详细解释下传参过程调用的时候,会进行参数的值传递。函数则是,如上。我们可以通过这样就可以应用下的所有方法了。也就是说,在没有传入参数的时候,通过可以让我们的拥有其他的方法

function 值传递

解决:什么时候什么样的参数传递,会修改外部参数。
1.参数传入function的过程,是一个值复制的过程。但是引用对象(object array function)保存的是,指针地址,所以传入的也是指针地址。这样,内存中就保持了两个相同的地址,指向同一个对象。

详细解释下:function 传参过程
function change(config){
  config.name = "changed" 
}

var obj = {name:"unchanged"}
change(obj);

调用function的时候,会进行参数的值传递。
obj = 一个对象吗?错,是对象在堆里的内存地址,
config = obj,是把对象的内存地址复制给config。这样config和obj指向同一个对象,config可以修改外部对象了
var obj1 = {
    value:"111"
};

var obj2 = {
      value:"222"
};

function changeStuff(obj){
      obj.value = "333";
      obj = obj2;
      return obj.value;
}

var foo = changeStuff(obj1);

console.log(foo);// "222" 参数obj指向了新的对象obj2
console.log(obj1.value);//333

理解了这个,就理解了function里的传值了
参考文献:
解释的超级清楚: http://fehacker.com/2014/12/19/call-by-sharing/

apply&call:修改function执行时,this指针对象

首先贴上api:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply#apply_and_built-in_functions
mdn官方文档

fn.apply(thisObj,[argumentsArr]),apply的第二个参数是数组(或者类数组)。apply首先会修改function里的this指针,接着把[argumentsArr]数组里的参数一个一个 push fn。
fn.call(thisObj,name,age),call函数则是,如上。

当我们拥有可以改变this指针的fn时候,我们可以做什么呢?

利用apply push arguments的特点,可以解决目标函数只接受传递n个参数,而不是数组的时候

寻找数组最大值
var number = [2,34,43,5,6,6]
Math.max(2,34,43,5,6,6)//因为max方法,不接受数组参数

Math.max.apply(null,number)//

当一个obj没有某个方法,但是其他对象实现了,就可以借助call使用

用的比较多的,通过document.getElementsByTagName选择的dom 节点是一种类似array的array。
它不能应用Array下的push,pop等方法。我们可以通过:
var domNodes =  Array.prototype.slice.call(document.getElementsByTagName("*"));
这样domNodes就可以应用Array下的所有方法了。

也就是说,在没有传入参数的时候,通过call可以让我们的obj拥有其他obj的方法

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78305.html

相关文章

  • 关于javascript中类型判断那些疑惑

    摘要:对于复杂类型它的每个实例都有属性。当检测实例时优于因为能检测这段代码是从的。补充以下结果,发现第三种方法也能正确判断出。我们知道结果是那如何判断两个变量呢比较两个变量,使用的即可。 Javascript中数据类型分为两种: 简单数据类型:Undefined, NULL, Boolean, Number, String 复杂数据类型:Object 接下来我们就来看看怎么做数据类型判别...

    李增田 评论0 收藏0
  • DOM疑惑整理(二)内联、嵌入、外联样式访问

    摘要:内联样式外联样式样式属性,写在外部文件,通过链接导入。内联样式注意点样式的应用,采取就近原则,因此一般情况优先级是内联样式嵌入样式外联样式。中有新的方式去查看完整的属性某元素内联外联嵌入样式合起来计算后的属性。 访问的style属性为空? 有时候,直接通过某元素的style属性去查看相关信息时,会发现查看到的是空的属性。原因很简单,style属性只能访问内联样式,而你把css写在了外部...

    Lucky_Boy 评论0 收藏0
  • 关于VUE响应式数据最佳解释

    摘要:遍历执行其中存储的所有的匿名函数。如果我们使用一个类来管理相关依赖,这很接近的表现方式代码看起来就像下面这样你会发现现在匿名函数被储存在而不是原来的。 许多前端框架(如Angular,React,Vue)都有自己的响应式引擎。通过理解如何响应,提议提升你的开发能力并能够更高效地使用JS框架。本文中构建的响应逻辑与Vue的源码是一毛一样的! 响应系统 初见时,你会惊讶与Vue的响应系统。...

    endiat 评论0 收藏0
  • 探秘JS异步单线程

    摘要:对于通常的特别是那些具备并行计算多线程背景知识的来讲,的异步处理着实称得上诡异。而这个诡异从结果上讲,是由的单线程这个特性所导致的。的特性之一是单线程,也即是从头到尾,都在同一根线程下运行。而这两者的不同,便在于单线程和多线程上。 对于通常的developer(特别是那些具备并行计算/多线程背景知识的developer)来讲,js的异步处理着实称得上诡异。而这个诡异从结果上讲,是由js...

    cooxer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<