成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS傳參技巧總結(jié)

wangshijun / 3461人閱讀

1.隱式創(chuàng)建 html 標(biāo)簽
這種方法一般配合 ajax,上面的 value 使用了模板引擎
2.window["data"]
window["name"] = "the window object";
3.使用 localStorage,cookie 等存儲(chǔ)
window.localStorage.setItem("name", "xiaoyueyue");
window.localStorage.getItem("name");
特點(diǎn):cookie,localStorage,sessionStorage,indexDB
特性 cookie localStorage sessionStorage indexDB
數(shù)據(jù)生命周期 一般由服務(wù)器生成,可以設(shè)置過期時(shí)間 除非被清理,否則一直存在 頁面關(guān)閉就清理 除非被清理,否則一直存在
數(shù)據(jù)存儲(chǔ)大小 4K 5M 5M 無限
與服務(wù)端通信 每次都會(huì)攜帶在 header 中,對(duì)于請(qǐng)求性能影響 不參與 不參與 不參與

從上表可以看到,cookie 已經(jīng)不建議用于存儲(chǔ)。如果沒有大量數(shù)據(jù)存儲(chǔ)需求的話,可以使用 localStoragesessionStorage 。對(duì)于不怎么改變的數(shù)據(jù)盡量使用 localStorage 存儲(chǔ),否則可以用 sessionStorage 存儲(chǔ)。

注意點(diǎn):存儲(chǔ)object類型數(shù)據(jù),此深拷貝方法會(huì)忽略掉函數(shù)和 undefined
var obj = {
  type: undefined,
  text: "xiaoyueyue",
  methord: function() {
    alert("I am an methord");
  }
};

localStorage.setItem("data", JSON.stringify(obj));
console.log(JSON.parse(localStorage.getItem("data"))); // {text: "xiaoyueyue"}
4.獲取地址欄方法

自己封裝的方法

function parseParam(url) {
  var paramArr = decodeURI(url)
      .split("?")[1]
      .split("&"),
    obj = {};
  for (var i = 0; i < paramArr.length; i++) {
    var item = paramArr[i];
    if (item.indexOf("=") != -1) {
      var tmp = item.split("=");
      obj[tmp[0]] = tmp[1];
    } else {
      obj[item] = true;
    }
  }
  return obj;
}

2.正則表達(dá)式方法

function GetQueryString(name) {
  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
  var r = window.location.search.substr(1).match(reg);
  if (r != null) return unescape(r[2]);
  return null;
}
5.標(biāo)簽綁定函數(shù)傳參




this 拓展

使用 this 傳參,在使用 art-template 中琢磨出來的,再也不用只傳遞一個(gè) id 拼接成好幾個(gè)參數(shù)了!happy!

var box = document.createElement("div");
box.innerHTML =
  "";
document.body.appendChild(box);

// name,age,friend
function alertInfo(data) {
  alert(
    "大家好,我是" +
      data.name +
      ", 我今年" +
      data.age +
      "歲了,我的好朋友是" +
      data.friend +
      " !"
  );
}
這里需要注意一點(diǎn):存儲(chǔ)的 data—含有大寫的單詞 =》這里會(huì)統(tǒng)一轉(zhuǎn)化為小寫,比如:data-orderId = “2a34fb64a13211e8a0f00050568b2fdd”,在實(shí)際取值的時(shí)候?yàn)?b>this.dataset.orderid;
event

既然可以使用 this,那么在事件當(dāng)中event.target方法也是可以的:

根據(jù) class 獲取當(dāng)前的索引值,參數(shù)可以為 event 對(duì)象
  var getIndexByClass =  function (param) {
    var element = param.classname ? param : param.target;
    var className = element.classname;
    var domArr = Array.prototype.slice.call(document.querySelectorAll("." + className));
    for (var index = 0; index < domArr.length; index++) {
      if (domArr[index] === element) {
        return index;
      }
    }
    return -1;
  },
6.HTML5 data-* 自定義屬性
var btn = document.querySelector("button");
btn.onclick = function() {
  alert(this.dataset.name);
};
7.字符串傳參 單個(gè)參數(shù)
var name = "xiaoyueyue",
  age = 25;

var box = document.createElement("div");
box.innerHTML = "";
document.body.appendChild(box);

// name, age
function alertInfo(name, age, home, friend) {
  alert("我是" + name);
}
多參傳遞
  var name = "xiaoyueyue",
      age = "25",
      home = "shanxi",
      friend = "heizi",
      DQ = """; // 雙引號(hào)的超文本標(biāo)記語言

    var params = """ + name + "","" + age + "","" + home + "","" + friend + """;
    var params2 = DQ + name + DQ + "," + DQ + age + DQ + "," + DQ + home + DQ + "," + DQ + friend + DQ;
    var box = document.createElement("div");
    box.innerHTML = "";
    console.log(box)
    document.body.appendChild(box);


    // name, age,home,friend
    function alertInfo(name, age, home, friend) {
      alert("我是" + name + "," + "我今年" + age + "歲了!")
復(fù)雜傳參
var data = [
  {
    name: "xiaoyueyue",
    age: "25",
    home: "shanxi",
    friend: "heizi"
  }
];

var box = document.createElement("div"),
  html = "";

for (var i = 0; i < data.length; i++) {
  html +=
    "";
}
box.innerHTML = html;
document.body.appendChild(box);

function alertInfo(id, name, age, home, friend) {
  alert("我是 " + name + " , " + friend + " 是我的好朋友");
}
8.arguments

arguments對(duì)象是所有(非箭頭)函數(shù)中都可用的局部變量。你可以使用 arguments 對(duì)象在函數(shù)中引用函數(shù)的參數(shù)。它是一個(gè)類數(shù)組的對(duì)象。

function fenpei() {
  var args = Array.prototype.slice.call(arguments);
  alert("我是" + args[2] + "油品,數(shù)量為 " + args[1] + " 噸, id為 " + args[0]);
}
9.form 表單

借助form表單,ajax 傳遞序列化參數(shù)

// form表單序列化,摘自JS高程
function serialize(form) {
  var parts = [],
    field = null,
    i,
    len,
    j,
    optLen,
    option,
    optValue;

  for (i = 0, len = form.elements.length; i < len; i++) {
    field = form.elements[i];

    switch (field.type) {
      case "select-one":
      case "select-multiple":
        if (field.name.length) {
          for (j = 0, optLen = field.options.length; j < optLen; j++) {
            option = field.options[j];
            if (option.selected) {
              optValue = "";
              if (option.hasAttribute) {
                optValue = option.hasAttribute("value")
                  ? option.value
                  : option.text;
              } else {
                optValue = option.attributes["value"].specified
                  ? option.value
                  : option.text;
              }
              parts.push(
                encodeURIComponent(field.name) +
                  "=" +
                  encodeURIComponent(optValue)
              );
            }
          }
        }
        break;

      case undefined: //fieldset
      case "file": //file input
      case "submit": //submit button
      case "reset": //reset button
      case "button": //custom button
        break;

      case "radio": //radio button
      case "checkbox": //checkbox
        if (!field.checked) {
          break;
        }
      /* falls through */

      default:
        //don"t include form fields without names
        if (field.name.length) {
          parts.push(
            encodeURIComponent(field.name) +
              "=" +
              encodeURIComponent(field.value)
          );
        }
    }
  }
  return parts.join("&");
}

栗子:

document.querySelector("button").onclick = function() {
  console.log("param: " + serialize(document.getElementById("formData"))); // param: ordersaleCode=&extractType=0
};
10. 發(fā)布訂閱處理復(fù)雜邏輯傳參
支持先訂閱后發(fā)布,以及先發(fā)布后訂閱

方法源碼

var Event = (function() {
  var clientList = {},
    pub,
    sub,
    remove;

  var cached = {};

  sub = function(key, fn) {
    if (!clientList[key]) {
      clientList[key] = [];
    }
    // 使用緩存執(zhí)行的訂閱不用多次調(diào)用執(zhí)行
    cached[key + "time"] == undefined ? clientList[key].push(fn) : "";
    if (cached[key] instanceof Array && cached[key].length > 0) {
      //說明有緩存的 可以執(zhí)行
      fn.apply(null, cached[key]);
      cached[key + "time"] = 1;
    }
  };
  pub = function() {
    var key = Array.prototype.shift.call(arguments),
      fns = clientList[key];
    if (!fns || fns.length === 0) {
      //初始默認(rèn)緩存
      cached[key] = Array.prototype.slice.call(arguments, 0);
      return false;
    }

    for (var i = 0, fn; (fn = fns[i++]); ) {
      // 再次發(fā)布更新緩存中的 data 參數(shù)
      cached[key + "time"] != undefined
        ? (cached[key] = Array.prototype.slice.call(arguments, 0))
        : "";
      fn.apply(this, arguments);
    }
  };
  remove = function(key, fn) {
    var fns = clientList[key];
    // 緩存訂閱一并刪除
    var cachedFn = cached[key];
    if (!fns && !cachedFn) {
      return false;
    }
    if (!fn) {
      fns && (fns.length = 0);
      cachedFn && (cachedFn.length = 0);
    } else {
      if (cachedFn) {
        for (var m = cachedFn.length - 1; m >= 0; m--) {
          var _fn_temp = cachedFn[m];
          if (_fn_temp === fn) {
            cachedFn.splice(m, 1);
          }
        }
      }
      for (var n = fns.length - 1; n >= 0; n--) {
        var _fn = fns[n];
        if (_fn === fn) {
          fns.splice(n, 1);
        }
      }
    }
  };
  return {
    pub: pub,
    sub: sub,
    remove: remove
  };
})();

在微信小程序中使用的例子:

全局掛載使用

// app.js
App({
  onLaunch: function(e) {
    // 注冊(cè) storage,這是第二條
    wx.Storage = Storage;
    // 注冊(cè)發(fā)布訂閱模式
    wx.yue = Event;
  }
});

使用實(shí)例

// 添加收貨地址頁面訂閱
 onLoad: function (options) {
        wx.yue.sub("addAddress", function (data) {
            y.setData({
                addAddress: data
            })
        })
 }
/**
 * 生命周期函數(shù)--監(jiān)聽頁面隱藏
 */
 onHide: function () {
    // 取消多余的事件訂閱
    wx.Storage.removeItem("addAddress");
},
 onUnload: function () {
    // 取消多余的事件訂閱
    wx.yue.remove("addAddress");
}
// 傳遞地址頁面獲取好數(shù)據(jù)傳遞
wx.yue.pub("addAddress", data.info);
// 補(bǔ)充跳轉(zhuǎn)返回
注意:使用完成數(shù)據(jù)后要注意卸載,在頁面被關(guān)閉時(shí)操作
拓展閱讀

JavaScript 參數(shù)傳遞的深入理解

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108147.html

相關(guān)文章

  • JavaScript 函數(shù)式編程技巧 - 反柯里化

    摘要:作為函數(shù)式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。而反柯里化,從字面講,意義和用法跟函數(shù)柯里化相比正好相反,擴(kuò)大適用范圍,創(chuàng)建一個(gè)應(yīng)用范圍更廣的函數(shù)。作為函數(shù)式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 可以對(duì)照另外一篇介紹 JS 柯里化 的文章一起看~ 1. 簡介 柯里化,是固定部分參數(shù),返回一個(gè)接受剩余參數(shù)的函數(shù),也稱為部分計(jì)算函數(shù),目的是為了縮...

    zhjx922 評(píng)論0 收藏0
  • 7個(gè)javascript實(shí)用小技巧

    摘要:每種編程語言都有一些黑魔法或者說小技巧,也不例外,大部分是借助或者瀏覽器新特性實(shí)現(xiàn)。下面介紹的個(gè)實(shí)用小技巧,相信其中有些你一定用過。當(dāng)然不管語言如何變化,我們總能在編程中總結(jié)一些小技巧來精簡代碼。 showImg(https://segmentfault.com/img/remote/1460000018902642); 每種編程語言都有一些黑魔法或者說小技巧,JS也不例外,大部分是借...

    tinysun1234 評(píng)論0 收藏0
  • JavaScript如何工作:V8引擎深入探究 + 優(yōu)化代碼的5個(gè)技巧(譯文)

    摘要:引擎可以是一個(gè)標(biāo)準(zhǔn)的解釋器,也可以是一個(gè)將編譯成某種形式的字節(jié)碼的即時(shí)編譯器。和其他引擎最主要的差別在于,不會(huì)生成任何字節(jié)碼或是中間代碼。不使用中間字節(jié)碼的表示方式,就沒有必要用解釋器了。 原文地址:https://blog.sessionstack.com... showImg(https://segmentfault.com/img/bVVwZ8?w=395&h=395); 數(shù)周之...

    William_Sang 評(píng)論0 收藏0
  • JavaScript 實(shí)戰(zhàn)開發(fā)經(jīng)驗(yàn)!函數(shù)多參數(shù)傳參技巧

    摘要:學(xué)堂碼匠掌握代碼的你,一定編寫封裝過函數(shù),為了提升函數(shù)的控制性,必不可少的就是參數(shù),必選可選的一大堆參數(shù)羅列出來,函數(shù)調(diào)用貌似變得麻煩起來必選參數(shù)指的是必須要傳入實(shí)參的參數(shù)可選參數(shù)在函數(shù)中有默認(rèn)值,如有傳入實(shí)參,則取實(shí)參的值,如果沒有傳入 HTML5學(xué)堂-碼匠:掌握J(rèn)avaScript代碼的你,一定編寫封裝過函數(shù),為了提升函數(shù)的控制性,必不可少的就是參數(shù),必選可選的一大堆參數(shù)羅列出來,...

    wing324 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<